




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第六讲 对象的赋值和复制,2,对象的赋值和复制,对象的赋值 同一类的两个对象可以相互赋值,即不同对象的成员分别复制。通过 运算符的重载实现。 对象1 对象2; 注意: 对象的赋值只对其中的数据成员赋值,而不复制成员函数。 类的数据成员中不能包括动态分配的数据!,Box box1(12,13,14), box2; box2 = box1;,3,拷贝构造函数用一个已有同类对象的数据 对正在建立的对象进行数据初始化. C+为类提供默认版本的拷贝构造函数 程序员可以定义用户版本的拷贝构造函数,对象的赋值和复制,语法形式 类名 : 类名(const 类名 & 引用名); Const可以不写,&必须写,对象的复制,Box box1(12,13,14); Box box2 = box1;,默认复制(拷贝)构造函数,class Atype private: 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 b ( a ); A c = b ;,调用拷贝构造函数的两种典型方法,6,默认拷贝构造函数,对于类来说,拷贝构造函数是必须的; 没有定义,则生成默认的拷贝构造函数内置在类中; 默认拷贝构造函数是单参数的,而且参数是同属一类的对象; 默认拷贝构造函数可以被重载.,7,拷贝构造函数,A a; A b=a; /调用拷贝构造函数 A c(a); /调用拷贝构造函数 重载拷贝构造函数 拷贝构造函数的参数必须为引用参数,8,拷贝构造函数的执行,用已有对象初始化创建对象。 当对象作函数参数时,因为要用实参初始化形参,也要调用拷贝构造函数。 对象引用调用不会调用构造函数和析构函数。 函数返回对象 返回一个临时对象,这样调用一次临时对象的析构函数 赋值不可以,9,class Box public : Box( ); Box(const Box,调用拷贝构造函数的时机,Box:Box(const Box ,void main() Box shoesBox; Box b1 = shoesBox; Box b2(b1); ,代码模拟,10,class Box public : Box( ); Box(const Box,调用拷贝构造函数的时机,void test (Box b) cout“ test fuction: “endl; void main() Box b ( 1, 2 ) ; test ( b ) ; ,/ 调用拷贝构造函数,一个带 类参数的函数,11,默认拷贝构造函数可以完成对象的数据成员值 简单的复制; 对象的数据资源是由指针指示的堆时,默认拷贝构造函数仅作指针值复制,需显式定义拷贝构造函数。,拷贝构造函数,12,/一个有问题的程序 #include #include class 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(pn) ; name : name() cout “ Destructing “ pname endl ; pname0 = 0 ; delete pname ; size = 0 ; ,14,/一个有问题的程序 #include #include class name public : name(char *pn) ; name() ; private : char *pname ; int size ; ;,浅复制和深复制,void main() name Obj1(“No Name“) ; name Obj2 = Obj1 ; ,调用默认版本 复制构造函数,错误 内存已经释放,15,/修改程序 #include #include class name public : name(char *pn) ; name(name Obj ,浅复制和深复制,name:name(name Obj ,定义拷贝构造函数,void main() name Obj1(“NoName“) ; name Obj2 = Obj1 ; ,16,/修改程序 #include #include class name public : name(char *pn) ; name(name Obj ,浅复制和深复制,void main() name Obj1(“NoName“) ; name Obj2 = Obj1 ; ,7,Obj2.pname,Obj2.size,N o N a m e 0,17,标记赋值,class student public: student(int n,char *na); student(); student(const student ,student:student(int n,char *na) num=n; name=new char10; strcpy(name,na); copy=1; cout“constructorn“; student:student() if(copy=1) delete name; cout“destructorn“; ,18,标记赋值,student:student(const student ,void main() students1(1,“abc“); s1.print(); student s2=s1; s2.print(); ,19,总结:拷贝构造函数,默认拷贝构造函数可以完成对象的数据成员值 简单的复制; 对象的数据涉及资源时,显式定义复制构造函数 拷贝构造函数只适用于初始化: 用一个对象显式初始化另一个对象。 函数值传递 生成临时对象,调用,20,作业电子版,定义一个学生类如下: class student public: 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为一个类,则该类的拷贝构造函数的声明语句
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 景区客运驾驶管理制度
- 乡镇卫生院规范管理制度
- 单位保洁制度与管理制度
- 办公室图书分类管理制度
- 团队分工及任务管理制度
- 公司员工热饭间管理制度
- 家乐福薪酬体系管理制度
- 公司品牌推广部管理制度
- 公司用外勤人员管理制度
- 施工项目水电管理制度
- 2025年高考安徽卷物理真题(解析版)
- 暑假安全家长会课件
- 新版2025心肺复苏术指南
- 2024年秋儿童发展问题的咨询与辅导终考期末大作业案例分析1-5答案
- TSG ZF001-2006《安全阀安全技术监察规程》
- DL∕T 796-2012 风力发电场安全规程
- 高压旋喷桩设备基础加固工程施工方案
- 毕业设计(论文)基于单片机的自动计数与装箱控制系统设计
- 土地利用现状分类2007与2017对照表
- 工业区厂房改造工程施工组织设计
- 煤矿采矿权评估报告
评论
0/150
提交评论