C++面向对象关于构造函数_第1页
C++面向对象关于构造函数_第2页
C++面向对象关于构造函数_第3页
C++面向对象关于构造函数_第4页
C++面向对象关于构造函数_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

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-22自定义缺省构造函数:自定义缺省构造函数:1.无参数无参数 2.带带缺省值缺省值系统默认构造函数系统默认构造函数构造函构造函数两种数两种情形情形2.缺省构造函数缺省构造函数2006-11-22如果程序中未声明,系统自动产生出一个缺省形式的构造函数如果程序中未声明,系统自动产生出一个缺省形式的构造函数缺省构造函数不能超过一个,否则会有(缺省构造函数不能超过一个,否则会有(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();Point(Point &p)

4、;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-11-224.派生类的构造函数派生类的

5、构造函数职责职责:基类成员:基类构造函数完成内嵌对象成员新增成员注意注意:基类构造函数,内嵌对象构造函数的局部调用顺序1. 缺省调用方式举例举例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( )coutconstructing B3 *endl;class C: publ

6、ic 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 B2 4constructing B3 *Press any k

7、ey to continue返返 回回2006-11-224.深拷贝与浅拷贝深拷贝与浅拷贝浅拷贝只适合当对象中没有动态资源申请的数据对象,浅拷贝只适合当对象中没有动态资源申请的数据对象,默认的、系统自动产生的拷贝构造函数是浅拷贝默认的、系统自动产生的拷贝构造函数是浅拷贝在对象中有动态资源申请的对象时,必须要用深拷贝,在对象中有动态资源申请的对象时,必须要用深拷贝,否则析构会出错,而且不同的对象在利用拷贝构造产否则析构会出错,而且不同的对象在利用拷贝构造产生时会指向内存的同一段区域生时会指向内存的同一段区域2006-11-22浅拷贝举例浅拷贝举例#include iostream.hclass

8、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 str is :pcharendl;void main()A a(10,abc

9、de);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);siz

温馨提示

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

评论

0/150

提交评论