c-中构造函数和析构函数讲解课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《c-中构造函数和析构函数讲解课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 构造 函数 讲解 课件
- 资源描述:
-
1、10.1 构造函数构造函数10.2 析构函数析构函数10.3 实现类型转换和实现类型转换和 拷贝的构造函数拷贝的构造函数10.4 构造函数和对象成员构造函数和对象成员第第10章章 构造函数和析构函数构造函数和析构函数给对象的数据成员赋值有二类(四种)方法:给对象的数据成员赋值有二类(四种)方法:1.定义时赋值(初始化)定义时赋值(初始化)(1)用数据列表初始化(数据成员为公有访问权限);)用数据列表初始化(数据成员为公有访问权限);(2)用)用构造函数构造函数初始化。初始化。2.定义后赋值定义后赋值(1)用成员函数赋值)用成员函数赋值-回顾第回顾第9章章示例示例3;(2)用同类型的对象赋值。)
2、用同类型的对象赋值。如:如:class A public:int a,b;void set(int x,int y)a=x;b=y;void main()A a1=5,10,a2,a3;a2.set(15,20);a3=a1;10.1 构造函数构造函数1.构造函数是实现数据成员初始化的特殊的构造函数是实现数据成员初始化的特殊的成员函数成员函数;2.构造函数构造函数与类同名与类同名,没有类型没有类型,也,也不返回值不返回值;3.创建对象时,构造函数创建对象时,构造函数被自动调用被自动调用。每创建一个对象每创建一个对象都必须调用一次构造函数都必须调用一次构造函数,每调用一次构造函数必定创,每调用一
3、次构造函数必定创建一个对象。建一个对象。1.普通构造函数:普通参数;普通构造函数:普通参数;2.拷贝构造函数:参数为对象的引用。拷贝构造函数:参数为对象的引用。一个类至少有上述两个构造函数,可以有更多的构造一个类至少有上述两个构造函数,可以有更多的构造函数(构造函数允许函数(构造函数允许重载重载),以实现不同形式对象的创),以实现不同形式对象的创建。建。10.1 构造函数构造函数1.类中定义格式类中定义格式 类名类名(形参列表)(形参列表)./函数体,对数据成员赋值函数体,对数据成员赋值2.类中说明,类外定义类中说明,类外定义(1)类中说明类中说明 类名类名(形参列表);(形参列表);(2)类
4、外定义)类外定义 类名类名:类名类名(形参列表)(形参列表)./函数体函数体10.1 构造函数构造函数例例10-1 定义表示平面点的类定义表示平面点的类Point及其构造函数。及其构造函数。class Pointfloat x,y;public:Point(float a,float b);Point(float a)x=y=a;void print()cout(x,y“)n”;Point:Point(float a,float b)x=a;y=b;10.1 构造函数构造函数建立对象时,必须提供与构造函数建立对象时,必须提供与构造函数形参一致形参一致的的实参实参,其,其基本格式只有如下两种形式
5、:基本格式只有如下两种形式:类名类名 对象名(实参)对象名(实参);类名类名 对象名;对象名;例例10-2 用例用例10-1定义的类定义对象,并初始化。定义的类定义对象,并初始化。class Point float x,y;public:Point(float a,float b);Point(float a)x=y=a;void print()cout(x,y“)n”;Point:Point(float a,float b)x=a;y=b;void main()Point p1(5),p2(10,15);p1.print();p2.print();10.1 构造函数构造函数主函数中,能否添加
6、下列语句:主函数中,能否添加下列语句:Point p3;1.缺省构造函数的种类缺省构造函数的种类(1)系统)系统自动产生自动产生的构造函数,如下所示:的构造函数,如下所示:类名()类名()(2)用户定义的)用户定义的没有参数没有参数的构造函数;的构造函数;(3)用户定义的)用户定义的所有参数都有缺省值所有参数都有缺省值的构造函数。的构造函数。2.用缺省构造函数创建对象的格式:用缺省构造函数创建对象的格式:类名类名 对象名对象名;3.使用时的注意使用时的注意(1)只有在用户没有定义构造函数时,系统才自动产)只有在用户没有定义构造函数时,系统才自动产生构造函数;生构造函数;(2)类中可能没有缺省的
7、构造函数;)类中可能没有缺省的构造函数;(3)一个类最多只能有一个缺省的构造函数。)一个类最多只能有一个缺省的构造函数。10.1 构造函数构造函数例例10-3 缺省构造函数的使用。缺省构造函数的使用。class Pointfloat x,y;public:Point()x=0;y=0;Point(float a ,float b )x=a;y=b;/Avoid print()cout(x,y“)n”;void main()Point p1,p2(1,2);p1.print();p2.print();10.1 构造函数构造函数主函数能否增加:主函数能否增加:Point p3();p3.print
8、();能否对能否对A行作如下修改?行作如下修改?=0 =01.用用new运行符产生动态对象运行符产生动态对象(1)产生单个对象(可以初始化);)产生单个对象(可以初始化);(2)产生数组对象(不能初始化)。)产生数组对象(不能初始化)。如:如:class C float r,i;public:C(float r1,float i1)r=r1;i=i1;cout“构造构造n”;C()r=i=0;cout“缺省构造缺省构造n”;void main()C*p1=new C,*p2=new C(2,-3),*p3=new C5;10.1 构造函数构造函数2.用用new为指针成员分配动态空间为指针成员分
9、配动态空间 当类的数据成员为指针时,在构造函数中应:当类的数据成员为指针时,在构造函数中应:先先用用new运算符为指针动态运算符为指针动态分配空间分配空间;然后然后再对再对指针所指指针所指空间空间赋值。赋值。如:如:class Array int*p;.;/p表示表示10个元素的一维数组个元素的一维数组则如下的构造函数都是错误的:则如下的构造函数都是错误的:Array(int*t)p=t;Array(int*t)*p=*t;Array(int*t)for(int i=0;i10;i+)pi=ti;Array(int*t)p=new int10;p=t;/*p=*t;正确的应为:正确的应为:Ar
10、ray(int*t)p=new int10;/分配动态空间分配动态空间 for(int i=0;i10;i+)pi=ti;/对动态空间赋值对动态空间赋值 10.1 构造函数构造函数1.析构函数的概念析构函数的概念用于撤消对象的成员函数。用于撤消对象的成员函数。2.定义格式定义格式(1)类中定义)类中定义 类名()类名()./函数体函数体(2)类中说明,类外定义)类中说明,类外定义 类中说明类中说明 类名();类名();/类中说明类中说明 类外定义类外定义 类名类名:类名()类名()/类外定义类外定义 ./函数体函数体10.2 析构函数析构函数3.使用时注意:使用时注意:(1)析构函数的名称由运
11、算符)析构函数的名称由运算符与类名组成;与类名组成;(2)析构函数无函数类型,无参数,且不返回值;)析构函数无函数类型,无参数,且不返回值;(3)析构函数不可以重载,每个类只有一个析构函数;)析构函数不可以重载,每个类只有一个析构函数;(4)类中通常不需要定义析构函数,而由系统自动产生)类中通常不需要定义析构函数,而由系统自动产生一个如下的缺省析构函数:一个如下的缺省析构函数:类名类名:类名()类名()(5)当类中用)当类中用new 运算符分配了动态空间时,必须定义运算符分配了动态空间时,必须定义析构函数,并在函数体中用析构函数,并在函数体中用delete运算符释放动态空间。运算符释放动态空间
12、。4.构造函数与析构函数的调用过程构造函数与析构函数的调用过程在创建对象时,调用构造函数;在撤消对象时,调用析在创建对象时,调用构造函数;在撤消对象时,调用析构函数;所以它们的调用过程(顺序)通常是相反的。构函数;所以它们的调用过程(顺序)通常是相反的。10.2 析构函数析构函数 当一个对象被赋值为一个数字,如果这个数字可以放入某个构当一个对象被赋值为一个数字,如果这个数字可以放入某个构造函数实现对这个构造函数的调用时,则该赋值语句成立造函数实现对这个构造函数的调用时,则该赋值语句成立。其实质。其实质是以所给的数据为参数调用普通的构造函数初始化对象,此时的构是以所给的数据为参数调用普通的构造函
13、数初始化对象,此时的构造函数称为类型转换的构造函数。造函数称为类型转换的构造函数。例例10-4 用类型转换的构造函数初始化对象。用类型转换的构造函数初始化对象。class Ex int x,y;public:Ex(int a,int b=10)x=a;y=b;cout“x=”x“,y=”y“n”;Ex()coutx“,释放对象。释放对象。n”;void main()Ex e1(5);Ex e2=15;e1=20;cout“End.n”;10.3 实现类型转换和拷贝的构造函数实现类型转换和拷贝的构造函数其中:其中:Ex e2=15;等同于等同于Ex e2(15);e1=20;等同于等同于e1=E
14、x(20);x=5,y=10 x=15,y=10 x=20,y=1020,释放对象。释放对象。End.15,释放对象。释放对象。20,释放对象。释放对象。拷贝功能的构造函数实现:用一个已建立的对象初始化同类型的拷贝功能的构造函数实现:用一个已建立的对象初始化同类型的对象,其调用格式为:对象,其调用格式为:类名类名 新对象名(已建立对象名)新对象名(已建立对象名);或或类名类名 新对象名新对象名=已建立对象名已建立对象名;例例10-5 用拷贝构造函数初始化对象。用拷贝构造函数初始化对象。class Ex int x,y;public:Ex(int a,int b)x=a;y=b;cout“x=”
15、x“,y=”y“,普通构造。普通构造。n”;Ex(Ex&t)/拷贝功能的构造函数拷贝功能的构造函数 x=t.x;y=t.y;cout“x=”x“,y=”y“,拷贝构造。拷贝构造。n”;void main()Ex e1(5,10);Ex e2(e1);Ex e3=e2;10.3 实现类型转换和拷贝的构造函数实现类型转换和拷贝的构造函数x=5,10,普通构造普通构造x=5,10,拷贝构造拷贝构造x=5,10,拷贝构造拷贝构造l与普通构造函数相似,若用户不定义拷贝功能构造函数,系与普通构造函数相似,若用户不定义拷贝功能构造函数,系统自动产生一个缺省的拷贝功能构造函数,它把已建立对象统自动产生一个缺省
16、的拷贝功能构造函数,它把已建立对象各数据成员的值依次赋给新对象。其定义如下:各数据成员的值依次赋给新对象。其定义如下:类名类名:类名类名(类名类名&对象名对象名)*this=对象名;对象名;l用户通常可以直接使用缺省的拷贝功能构造函数,但在以下用户通常可以直接使用缺省的拷贝功能构造函数,但在以下情况下必须重新定义:情况下必须重新定义:(1)新建对象与已建立对象的数据有差异;如)新建对象与已建立对象的数据有差异;如:Ex2 e2(e1);(2)数据成员中有指针,并使用了动态内存。)数据成员中有指针,并使用了动态内存。l类的构造函数有两类、多种形式,使用时应加以区分。类的构造函数有两类、多种形式,
17、使用时应加以区分。10.3 实现类型转换和拷贝的构造函数实现类型转换和拷贝的构造函数例例10-6 用普通构造函数和拷贝构造函数创建对象。用普通构造函数和拷贝构造函数创建对象。class A public:A(int x=1)coutx“t”;A(A&t)cout“拷贝拷贝t”;void main()A a1,a2(2),a3=3;coutn;A a4=A(4),a5=a1,a6(a1);coutn;a1=5;a2=a1;a3=A(0);coutn;10.3 实现类型转换和拷贝的构造函数实现类型转换和拷贝的构造函数运行结果运行结果:1234 拷贝拷贝拷贝拷贝 拷贝拷贝50程序中共创建了几个对象?
展开阅读全文