拷贝构造函数例题课件_第1页
拷贝构造函数例题课件_第2页
拷贝构造函数例题课件_第3页
拷贝构造函数例题课件_第4页
拷贝构造函数例题课件_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

拷贝构造函数及应用人员类电话用户服务类拷贝构造函数及应用引用 C++函数中参数的传递方式是传值。在函数域中为参数重新分配内存,而把实参的数值传递到新分配的内存中。它的优点是有效避免函数的副作用。如果要求改变实参的值,怎么办呢?如果实参是一个复杂的对象,重新分配内存会引起程序执行效率大大下降,怎么办呢?在C++中有一种新的导出型数据类型—引用(reference)可以解决上面的难题。引用又称别名(alias)。引用 C++函数中参数的传递方式是传值。在函数域中为参注意:1.对数组只能引用数组元素,不能引用数组(数组名本身为地址)。2.不能定义引用的引用(引用也是地址),所以当函数的参数为引用时,引用不能作实参。注意:拷贝构造函数

同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为拷贝构造函数(CopyConstructor)。CGoods类,拷贝构造函数为:

CGoods(CGoods&cgd){

Strcpy(Name,cgd.Name);

Price=cgd.price;

Amount=cgd.Amount;

Totalvalue=cgd.Totalvalue; }拷贝构造函数同一个类的对象在内存中有完全相同

拷贝构造函数的参数——采用引用。如果把一个真实的类对象作为参数传递到拷贝构造函数,会引起无穷递归。

系统会自动提供称为缺省的按成员语义支持的拷贝构造函数,每个类成员被依次拷贝,亦称为缺省的按成员初始化。按成员作拷贝是通过依次拷贝每个数据成员实现的,而不是对整个类对象按位拷贝。赋值运算符“=”称缺省的按成员拷贝赋值操作符,同类对象之间可以用“=”直接拷贝。

通常按成员语义支持已经足够。但在某些情况下,它对类与对象的安全性和处理的正确性还不够,这时就要求类的设计者提供特殊的拷贝构造函数和拷贝赋值操作符的定义。拷贝构造函数的参数——采用引用。如果把一个真实的类对象作拷贝构造函数的另2个用途:1.当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。这时要在内存新建立一个局部对象,并把实参拷贝到新的对象中。2.当函数的返回值是类对象,函数执行完成返回调用者时使用。原因也是要存储在一个临时对象中,再返回调用者。

因为局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象的生存周期只在函数调用处的表达式中。拷贝构造函数的另2个用途: 因为局部对象在离开建立它的函数时【例1】设计一个人员类(Person)

设计一个学校在册人员类(Person)。数据成员包括:

身份证号(IdPerson), 姓名(Name), 性别(Sex), 生日(Birthday) 家庭住址(HomeAddress)。成员函数包括人员信息的录入和显示。还包括构造函数与拷贝构造函数。设计一个合适的初始值。【例1】设计一个人员类(Person) 设计一个学校在册人员#include<iostream.h>#include<string.h>enum

Tsex{mid,man,woman};//枚举类型classPerson{

charIdPerson[19];//身份证号,18位数字

charName[20]; //姓名

TsexSex; //性别

intBirthday;//生日,格式1986年8月18日写作19860818

charHomeAddress[50]; //家庭地址#include<iostream.h>public:

Person();

Person(char*,char*,Tsex,int,char*);

Person(Person

&);

~Person();

voidPrintPersonInfo();//打印信息

voidinputPerson();//输入信息

//其他接口函数};public:Person::Person(){//缺省构造函数

cout<<"缺省构造Person"<<endl; IdPerson[0]='\0'; Name[0]='\0'; Sex=mid; Birthday=0; HomeAddress[0]='\0';}Person::Person(){//缺Person::Person(char*id,char*name,Tsexsex,intbirthday,char*homeadd){//带参构造函数

cout<<"构造Person"<<endl;

strcpy(IdPerson,id); strcpy(Name,name); Sex=sex; Birthday=birthday;

strcpy(HomeAddress,homeadd);}Person::Person(char*id,char*Person::Person(Person&Ps){//拷贝构造函数

cout<<"拷贝构造Person"<<endl; strcpy(IdPerson,Ps.IdPerson); strcpy(Name,Ps.Name); Sex=Ps.Sex; Birthday=Ps.Birthday; strcpy(HomeAddress,Ps.HomeAddress);}Person::~Person(){//析构函数

cout<<"析构Person"<<endl;}Person::Person(Person&Ps){voidPerson::inputPerson(){//输入信息

charid[19]; //身份证号,18位数字

charname[20]; //姓名

Tsexsex; //性别

intbirthday; //生日,格式1986年8月18日写作19860818

charhomeadd[50];

charch; cout<<"请输入身份证号,18位数字:"<<endl; cin.getline(id,19); cout<<"请输入姓名:"<<endl; cin.getline(name,20);定义变量输入变量值voidPerson::inputPerson(){ cout<<"请输入性别m或w:"<<endl; cin>>ch;

if(ch=='m')sex=man;

else

sex=woman; cout<<"请输入生日,格式1986年8月18日写作19860818:"<<endl; cin>>birthday; cout<<"请输入地址:"<<endl; cin.getline(homeadd,50); strcpy(IdPerson,id); strcpy(Name,name);

Sex=sex;

Birthday=birthday; strcpy(HomeAddress,homeadd);}

输入变量值为成员赋值 cout<<"请输入性别m或w:"<<endl;输入变量值voidPerson::PrintPersonInfo(){//打印信息

inti; cout<<“身份证号:”<<IdPerson<<‘\n’<<“姓名:”<<Name<<'\n'<<"性别:";

if(Sex==man)cout<<"男"<<'\n';

else

if(Sex==woman)cout<<"女"<<'\n';

elsecout<<""<<'\n'; cout<<"出生年月日:"; i=Birthday; cout<<i/10000<<"年"; i=i%10000; cout<<i/100<<“月”<<i%100<<“日”<<‘\n’<<“家庭住址:”<<HomeAddress<<'\n';}voidPerson::PrintPersonInfo()voidmain(){

Person

Ps1(“320102811226161”,“朱海鹏”,man,19811226,“南京市黄浦路1号”),Ps2(Ps1),Ps3;

Ps1.PrintPersonInfo();

Ps2.PrintPersonInfo();

Ps3.inputPerson();

Ps3.PrintPersonInfo();}voidmain(){【例2】设计一个电话用户类(Usetele

)数据成员为:用户编号,电话号码,用户类型成员函数为:构造函数(初始化信息)修改信息打印信息电话号码升位处理【例2】设计一个电话用户类(Usetele)数据成员为:classUsetele{private: intid;//用户编号

longnumber;//电话号码(七位,首位不为0和1)

charutype;//用户类型(A-公用,B-私用)public: Usetele(){id=0;number=0;utype='';} Usetele(inta,longb,charc){

id=a;

number=b;

utype=c; }classUsetele{

Usetele(Usetele&g){//拷贝构造函数

id=g.id+10; number=g.number; utype=g.utype; } voidmodify(inta,longb,charc){//修改信息

id=a; number=b; utype=c;cout<<a<<"信息已修改!"<<endl; } voidlist();//打印信息

voidExpand();//电话号码升位处理}; Usetele(Usetele&g){/voidUsetele::list(){//打印信息

cout<<"用户编号:"<<id<<endl; cout<<"电话号码:"<<number<<endl; cout<<"用户类型:"<<utype<<endl;}voidUsetele::list(){voidUsetele::Expand(){//电话号码升位处理

cout<<"电话号码"<<number; if(number>1e7)return; longa=number/1000000;//a取左边最高位数字

if(utype=='A') switch(a){ case2:case3:case4: case

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论