《学时类与对象对象的赋值和复制.ppt》由会员分享,可在线阅读,更多相关《学时类与对象对象的赋值和复制.ppt(21页珍藏版)》请在三一办公上搜索。
1、1,第六讲 对象的赋值和复制,2,对象的赋值和复制,对象的赋值同一类的两个对象可以相互赋值,即不同对象的成员分别复制。通过 运算符的重载实现。对象1 对象2;注意:对象的赋值只对其中的数据成员赋值,而不复制成员函数。类的数据成员中不能包括动态分配的数据!,Box box1(12,13,14),box2;box2=box1;,3,拷贝构造函数用一个已有同类对象的数据 对正在建立的对象进行数据初始化.C+为类提供默认版本的拷贝构造函数 程序员可以定义用户版本的拷贝构造函数,对象的赋值和复制,语法形式类名:类名(const 类名&引用名);Const可以不写,&必须写,对象的复制,Box box1(
2、12,13,14);Box box2=box1;,4,默认复制(拷贝)构造函数,class Atypeprivate:int a;public:Set(int i)a=i;Print()couta;,void main()Atype x;x.Set(10);Atype y=x;/Atype y(x);y.Print();,应用默认拷贝构造函数的两种格式,将x对象中的数据成员的值赋给新定义的对象y中的对应的数据成员。,5,class A public:A(int);A(const,拷贝构造函数,/拷贝构造函数,/创建对象 a,调用 A(int),/创建对象 b,调用 A(const A&),A
3、b(a);A c=b;,调用拷贝构造函数的两种典型方法,6,默认拷贝构造函数,对于类来说,拷贝构造函数是必须的;没有定义,则生成默认的拷贝构造函数内置在类中;默认拷贝构造函数是单参数的,而且参数是同属一类的对象;默认拷贝构造函数可以被重载.,7,拷贝构造函数,A a;A b=a;/调用拷贝构造函数A c(a);/调用拷贝构造函数重载拷贝构造函数拷贝构造函数的参数必须为引用参数,8,拷贝构造函数的执行,用已有对象初始化创建对象。当对象作函数参数时,因为要用实参初始化形参,也要调用拷贝构造函数。对象引用调用不会调用构造函数和析构函数。函数返回对象返回一个临时对象,这样调用一次临时对象的析构函数赋值
4、不可以,9,class Boxpublic:Box();Box(const Box,调用拷贝构造函数的时机,Box:Box(const Box,void main()Box shoesBox;Box b1=shoesBox;Box b2(b1);,代码模拟,10,class Boxpublic:Box();Box(const Box,调用拷贝构造函数的时机,void test(Box b)cout“test fuction:endl;void main()Box b(1,2);test(b);,/调用拷贝构造函数,一个带类参数的函数,11,默认拷贝构造函数可以完成对象的数据成员值 简单的复制;
5、对象的数据资源是由指针指示的堆时,默认拷贝构造函数仅作指针值复制,需显式定义拷贝构造函数。,拷贝构造函数,12,/一个有问题的程序#include#includeclass name public:name(char*pn);name();private:char*pname;int size;/包含字符的数目;,浅复制和深复制,代码练习,程序探讨,13,浅复制和深复制,name:name(char*pn)cout Constructing pn endl;pname=new charstrlen(pn)+1;if(pname!=0)strcpy(pname,pn);size=strlen(p
6、n);name:name()cout Destructing pname endl;pname0=0;delete pname;size=0;,14,/一个有问题的程序#include#includeclass name public:name(char*pn);name();private:char*pname;int size;,浅复制和深复制,void main()name Obj1(No Name);name Obj2=Obj1;,调用默认版本复制构造函数,错误内存已经释放,15,/修改程序#include#includeclass name public:name(char*pn);
7、name(name Obj,浅复制和深复制,name:name(name Obj,定义拷贝构造函数,void main()name Obj1(NoName);name Obj2=Obj1;,16,/修改程序#include#includeclass name public:name(char*pn);name(name Obj,浅复制和深复制,void main()name Obj1(NoName);name Obj2=Obj1;,7,Obj2.pname,Obj2.size,NoName0,17,标记赋值,class studentpublic:student(int n,char*na);
8、student();student(const student,student:student(int n,char*na)num=n;name=new char10;strcpy(name,na);copy=1;coutconstructorn;student:student()if(copy=1)delete name;coutdestructorn;,18,标记赋值,student:student(const student,void main()students1(1,abc);s1.print();student s2=s1;s2.print();,19,总结:拷贝构造函数,默认拷贝
9、构造函数可以完成对象的数据成员值 简单的复制;对象的数据涉及资源时,显式定义复制构造函数 拷贝构造函数只适用于初始化:用一个对象显式初始化另一个对象。函数值传递 生成临时对象,调用,20,作业电子版,定义一个学生类如下:class studentpublic:student(int n,char*na);student();student(const student,1、用浅复制方法实现该类,在main中调用拷贝构造函数;2、用深复制方法修改1运行时发生的错误;3、用加标记的方法修改1运行时发生的错误。,21,练习,1.设A为test类的对象且赋有初值,则语句test B=A;表示(c)A.语法错误 B.为对象A定义一个别名C.将对象A复制给对象B D.仅说明B和A属于同一个类2.假定AB为一个类,则该类的拷贝构造函数的声明语句为c。A AB”语句时,系统自动调用该类的构造函数的次数为 10。5.下面关于拷贝构造函数的特点描述错误的是(c).A.如果一个类中没有定义拷贝构造函数时,系统将产生一个默认的.B.拷贝构造函数只有一个参数,并且是该类对象的引用.C.拷贝构造函数的名字不能用类名.D.拷贝构造函数是一种成员函数.,