



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、深度探索C+对象模型(5)最小巧、最精致、测试最完整、性价比最高的无线射频开发平台和模块:NORDIC无线射频开发平台系列NORDIC无线射频模块系列最超值的ARM7/ARM9开发板系列AVR单片机开发板与仿真器上一篇我们对合成确省的构造函数做了一个了解,这一篇我们继续看看构造函数这个有趣的东西. Copy Constructor是什么?我们经常看到代码中有一些这样的函数调用方式X(X&) (“X of X ref”). 这个函数用用户自定义类型作为参数,那它的参数的构造便是由Copy Constructor负责的. 可见这个玩意非常重要,实际上Copy Constructor是由编译
2、器自动合成的,不需要你去作任何事情,但编译器都做了些什么呢?我们的问题出来了。 我们有三种情况需要用一个对象的内容作为另一个类对象的初值.也就是需要编译器来为我们自动合成Copy Constructor.一种是我们在编程中肯定回用到的由类生成对象例如以下形式: class ClassA. ClassA a; ClassA b=a; /一个Class对象以另一个对象做初值 另外的一种情况是以对象为参数在函数中传递看下面的伪码: /例如我们有一个CUser类 CUser CUser(); . ; /我们还有一个CDatabase类,它有一个AddNew的方法 CDatabase . public:
3、 AddNew(CUser userone); . /我们用CUser类产生了一个对象实例.userone,并将他作为AddNew函数的参数,以便 /AddNew函数能够完成在数据库中增加一条记录,用来记录一个用户的信息 CDatabase db=new CDatabase(); db.AddNew(CUser userone) /在这里,你不用将你的用户类的成员全部展开. 还有一种当然是用做函数的return,例如你可以在CDatabase类中添加一个函数用来读取一个用户的信息例如这样CUser GetUserOne(int userID),通过一个用户的唯一的编号可以获得一个用户的信息,并
4、返回一个CUser类的对象。 我们来看看Copy Constructor是如何工作的.首先Copy Constructor和Default Constructor一样都是在需要的时候由编译器产生出来,一个类如果没有声明一个Copy Constructor就会存在一个隐含的声明(或定义),它也被分为trivial和nontrivial两种. 我们来看书上的例子: Class Word public: Word(const char*); Word()delete str; private: int cnt; Char *str; 这个类的声明不需要合成出Default Copy Construc
5、tor.但当进行如下应用时: #include "Word.h" Word noun("lsmodel"); void foo() Word verb=noun; 结果将会出现灾难性的后果.为什么?因为我们的逻辑对象verb和全局对象noun都指向了相同的字符串,在退出函数foo()之前verb会执行析构, 则字符串被删除,从此全局对象nonu指向了一堆无意义的东西.你可以声明一个explicit copy constructor来解决这个问题,当然还可以让编译器来自动的给你合成一个Copy construct. 我们将上面的Word类改写成下面的样子:
6、 Class Word public: Word(const String&);/注意这里和我们开始的X(X&)形式一样 Word(); /. private: int cnt; String str; / 这个成员是String类的对象,String是我们自定义的类型 ; Class String public: String(const char*); String(const String&);/这里声明了一个Copy constructir String(); /. 这时在执行我们的代码 #include "Word.h" Word noun
7、("lsmodel"); void foo() Word verb=noun; 编译器会为我们的Word类合成一个Copy Constructor,用来调用它的str(member class String object)的Copy Constructor.象下面伪码表示的这样: inline Word:Word(const Word &wd) str.String:String(wd.str); cnt=t; 当这个类中有一个或多个虚函数时,或者这个类是派生于一个继承串链,并且这个串中有一个或多个虚拟的基类时.这个类在进行拷贝时便不会展现逐次拷贝 (bitwise
8、 copy).并且会通过合成的Copy Constructor来重新明确的设定vptr来指向虚函数表,而不是将右边对象的vprt直接拷贝过来.书上的ZooAnimal例子的图可以很清晰的描述出这点。 如果一个对象以另一个对象做初值,而后者有一个Virtual Base Class Subobject,那会怎样呢?任何一个编译器都会做到在派生类对象中的virtual base class Subobject的位置在执行期就准备妥当,但bitwise copy可能会破坏这一位置,因此也需要由编译器合成出一个copy constructor,来安插一些代码来设定virtual base class
9、pointer/offset,对每一个成员执行必要的memberwise初始化操作,以及执行内存相关的工作。 最后我们来总结一下上面说的内容,确实有些乱.雷神越来越觉得自己的缺乏文字描述能力. 我们这篇学习的内容是:当一个对象以另一个对象作为初始值时,会发生什么事情. 分成了两种情况,一种是我们声明了explicit copy constructor,这个不是这篇文章需要搞明白的(我想大家也都很明白了).我们想知道的是我们没有为class声明explicit copy constructor函数时编译器都干了些什么.编译器会为我们合成一个copy constructor.以便适应任何时候的对象被正确的初始化.并且我们了解了有以下四种情况class不在按位逐一进行拷贝. 1.当你设计的类声明了一个explicit copy constructor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中介与商家合同范例
- ppp 监控 合同样本
- 年初制定的有效工作计划
- 出租小户厨房合同标准文本
- 企业设计顾问合同标准文本
- 二三标段合同样本
- 制定合理的工作目标确保成功计划
- 2025授权合同代理书范本
- 公司旧厂房租赁合同样本
- 俩兄弟合伙开店合同标准文本
- 13人物描写一组 两茎灯草 课件
- 广东省广州市2023年初中学业水平考试中考数学试卷【含答案】
- 基于大概念的高中历史大单元教学
- 护理工作计划目标及措施
- 2023流域超标准洪水防御预案编制导则
- 基于ADE7758的三相多功能电表设计的开题报告
- 如何提高调查研究能力
- 农产品加工培训课件
- 初三励志、拼搏主题班会课件
- 工业自动化的系统架构与组成
- 问题性肌肤教育培训课件
评论
0/150
提交评论