C08-拷贝构造函数和赋值函数_第1页
C08-拷贝构造函数和赋值函数_第2页
C08-拷贝构造函数和赋值函数_第3页
C08-拷贝构造函数和赋值函数_第4页
C08-拷贝构造函数和赋值函数_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、第八章 拷贝构造函数和赋值函数对象拷贝(复制)的必要class A /略略;void Function( A aA) /略略void main()() A a; Function(a);class A public: void g() const;A Function( ) A aA; return aA;void main() Function().g( );按传值方式传递对象按传值方式传递对象按传值方式返回对象按传值方式返回对象对象的拷贝(复制) 拷贝的特点 从无到有地创建一个新对象 不同于普通构造函数,参数必须且只需一个本类对象 就是一种特殊的构造 拷贝构造函数的调用 显式调用:A a1

2、; A a2(a1); A a3=a1; 隐式调用:如上页 拷贝方式 位拷贝(浅拷贝、浅复制) 深拷贝(深复制)拷贝构造函数 含义:根据现有的对象,构造一个新的对象。 格式: T(const T&);class MyClass public: MyClass( int ); /自定义构造函数自定义构造函数 MyClass(const MyClass & obj) /自定义拷贝构造函数自定义拷贝构造函数 /略略 ;默认(缺省)的拷贝构造函数 默认的拷贝构造函数 没有显式提供拷贝构造函数时,由编译器提供 其访问控制是public的 拷贝方式是浅拷贝 位拷贝(浅拷贝、浅复制) 浅拷贝

3、的本质 内置类型成员 指针成员 引用成员 对象成员class AA /略略;class My public: My ( AA & a ) : mRefAA(a) private: int mVal; AA * mpAA; AA& mRefAA; AA mAA;自定义拷贝构造函数 自定义拷贝构造函数 基本同构造函数 访问控制、初始化列表 指明所有非静态数据成员如何拷贝 深拷贝(深复制) 按程序员的目的实现拷贝 深拷贝只能通过自定义拷贝构造函数实现 深拷贝的必要性浅拷贝的不足void main( ) B b1; B b2(b1);class A /略略;class B public

4、: B( ) pA = new A; B( ) delete pA; private: A * pA; 深拷贝(例)class B public: B( ) pA = new A; B( ) delete pA; B(const B& b) A * pTemp = b.pA; pA= new A(*pTemp); /或合成一句或合成一句 pA= new A(*b.pA); /或使用初始化列表或使用初始化列表 B(const B& b):pA(new A(*b.pA) private: A * pA;防止对象按值传递 私有化拷贝构造函数 只声明,无定义class My priva

5、te: My(const My& m); /没有类外实现没有类外实现 void Wrong01(My m) /*略略*/ My Wrong02( ) /*略略*/ ;void Wrong03(My m) /*略略*/ My Wrong04( ) /*略略*/ class My private: My(const My& m) /*略略*/ private: void f( ) My m1; My m2(m1); /合法合法 ;void main() My m1; My m2(m1);/编译错误编译错误class My public: My(const My& m); /

6、没有类外实现没有类外实现private: void f( ) My m1; My m2(m1); /链接错误链接错误 ;void main() My m1; My m2(m1);/链接错误链接错误对象的赋值 含义:根据已有的其它对象,修改当前对象。 比较复制(拷贝)与赋值 复制:从无到有新建一个 赋值:对象已存在,只是修改void main( ) A a1; A a2(a1); /拷贝拷贝 A a3=a2; /拷贝拷贝 a3 = a1; /赋值赋值默认的赋值函数 没有显式给出赋值函数时,由编译器提供 访问控制是public。 采用浅赋值 含义类似浅拷贝 对象成员的赋值 浅赋值的不足 赋值函数格

7、式: T& operator = (const T&); 默认的赋值函数 自定义的赋值函数浅赋值的不足class A /略略;class B public: B( ) pA = new A; B( ) delete pA; private: A * pA;void main( ) B b1, b2; b1 = b2;自定义的赋值函数 格式: T& operator= ( const T & rhs ); 检查自我赋值 效率 a = a 的情况 返回 *this赋值函数中判断自我赋值class A /*略略 */ ;class B public: B( ) pA = new A; B( ) delete pA; B& operator=(const B& rhs) if (this != &

温馨提示

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

评论

0/150

提交评论