




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2006-11-22关于构造函数关于构造函数1.构造函数的位置构造函数的位置2.缺省构造函数缺省构造函数3.拷贝构造函数拷贝构造函数4.派生类的构造函数派生类的构造函数5.深拷贝与浅拷贝深拷贝与浅拷贝2006-11-221.构造函数的位置只能放在公有函数成员的位置:构造函数的位置只能放在公有函数成员的位置:#include iostream.hclass Aprivate:/或者或者protected也会出错也会出错A()public:int i;void main()/主函数主函数A a;/cannot access private member declared in class A /
2、see declaration of A:A返返 回回2006-11-221. 自定义缺省构造函数:自定义缺省构造函数:1.无参数无参数 2.带带缺省值缺省值2. 系统默认构造函数系统默认构造函数构造函构造函数两种数两种情形情形2.缺省构造函数缺省构造函数2006-11-221. 如果程序中未声明,系统自动产生出一个缺省形式的构造函数如果程序中未声明,系统自动产生出一个缺省形式的构造函数2. 缺省构造函数不能超过一个,否则会有(缺省构造函数不能超过一个,否则会有(warning or error)返返 回回3.拷贝构造函数拷贝构造函数注意一种特殊情形,重载运算符注意一种特殊情形,重载运算符“=
3、”与拷贝构造的关系与拷贝构造的关系1.当没有重载运算符“”时:Point p2p1表示调用Point类的拷贝构造函数,与Point p2(p1)等价; 而 Point p2; p2=p1; 此时调用的是C自动重载运算符函数, 此时不会调用拷贝构造函数。2.当重载运算符“”时:与1相同,Point p2p1表示调用Point类的拷贝构造函数;而 Point p2; 而 p2=p1; 此时调用的是自定义的重载运算符函数,即Operator,同时参数传递和函数值返回的原因,会调用拷贝构造函数两次。下页例子#include iostream.hclass Pointpublic:Point();Poi
4、nt(Point &p);Point operator =(Point p)this-X=p.X;this-Y=p.Y;coutcall the = operator function !endl;return *this;private:int X,Y;Point:Point () cout构造函数被调用!endl;Point:Point (Point& p)X=p.X;Y=p.Y;cout拷贝构造函数被调用!endl;void main()Point p1,p2;/Point p2 = p1; 等价于Point p1(p2); p2=p1;运行结果运行结果返返 回回2006
5、-11-224.派生类的构造函数派生类的构造函数职责职责:1. 基类成员:基类构造函数完成2. 内嵌对象成员3. 新增成员注意注意:1. 基类构造函数,内嵌对象构造函数的局部调用顺序2. 缺省调用方式举例举例2:讨论构造函数的调用次序问题讨论构造函数的调用次序问题class B1/基类B1,构造函数有参数public:B1(int i) coutconstructing B1 iendl;class B2/基类B2,构造函数有参数public:B2(int j) coutconstructing B2 jendl;class B3/基类B3,构造函数无参数public:B3( )coutcon
6、structing B3 *endl;class C: public B2, public B1, public B3 public:C(int a, int b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b) private:B1 memberB1;B2 memberB2;B3 memberB3;void main( ) C obj(1,2,3,4);认真思考并回答其输出结果?constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing
7、B2 4constructing B3 *Press any key to continue返返 回回2006-11-224.深拷贝与浅拷贝深拷贝与浅拷贝1. 浅拷贝只适合当对象中没有动态资源申请的数据对象,浅拷贝只适合当对象中没有动态资源申请的数据对象,默认的、系统自动产生的拷贝构造函数是浅拷贝默认的、系统自动产生的拷贝构造函数是浅拷贝2. 在对象中有动态资源申请的对象时,必须要用深拷贝,在对象中有动态资源申请的对象时,必须要用深拷贝,否则析构会出错,而且不同的对象在利用拷贝构造产否则析构会出错,而且不同的对象在利用拷贝构造产生时会指向内存的同一段区域生时会指向内存的同一段区域2006-11
8、-22浅拷贝举例浅拷贝举例#include iostream.hclass Apublic:char *pchar;int size;A(int rsize,char *pconst);/构造函数构造函数声明声明void prt();/输出字符串信息输出字符串信息;A:A(int rsize,char *pconst)/构造函构造函数定义数定义size=rsize;pchar=new charsize;for(int i=0;*(pconst+i)!=0;i+)*(pchar+i)=*(pconst+i);*(pchar+i)=*(pconst+i);void A:prt()coutthe s
9、tr is :pcharendl;void main()A a(10,abcde);a.prt();A a1=a;a1.prt();*(a.pchar)=1;a.prt();a1.prt();程序运行结果程序运行结果2006-11-222006-11-22修改成深拷贝修改成深拷贝#include iostream.hclass Apublic:char *pchar;int size;A(int rsize,char *pconst);/构造函数声明构造函数声明A()/析构函数析构函数delete pchar;/A(A &a);/拷贝构造,深拷贝,声明拷贝构造,深拷贝,声明void prt();/输出字符串信息输出字符串信息;A:A(int rsize,char *pconst)/构造函数定构造函数定义义size=rsize;pchar=new charsize;for(int i=0;*(pconst+i)!=0;i+)*(pchar+i)=*(pconst+i);*(pchar+i)=*(pconst+i);/写入字符串结束写入字符串结束符符0A:A(A &a)/拷贝构造,是深拷贝拷贝构造,是深拷贝pchar=new chara.size;for(int i=0;ia.size;i+)*(pchar+i)=*(a.pchar+i);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公立医院正畸合同标准文本
- 业务拓展居间合同范例
- 代运营合同标准文本
- 个人借款房贷合同标准文本
- 企业内部激励机制构建
- 二手车商贷款合同标准文本
- 农机购销欠款合同标准文本
- 保密责任合同标准文本
- 九年级化学上册 8.1.1 碳的单质教学实录 (新版)北京课改版
- cba球员合同标准文本
- DB11T 856-2012 门牌、楼牌 设置规范
- 中学特殊学生管理方案112
- 【课件】+文化与习俗-从“泥土”中诞生的美+课件-高中美术人美版(2019)美术鉴赏
- DBJ04∕T 289-2020 建筑工程施工安全资料管理标准
- 幼儿园大班社会《认识交通工具》课件
- 初三年级组长“走进初三誓师大会”发言稿
- 《电工电子技术基础》高职全套教学课件
- 2024北京电子科技职业学院招聘笔试备考题库及答案解析
- 第十五课 中望3D-工程图系列2讲解
- 2024-2029年中国3D裸眼技术行业市场发展分析及发展趋势与投资前景研究报告
- DZ∕T 0220-2006 泥石流灾害防治工程勘查规范(正式版)
评论
0/150
提交评论