cppCH3构造函数与析构函数

上传人:油条 文档编号:26873161 上传时间:2018-01-02 格式:PPT 页数:33 大小:208.50KB
返回 下载 相关 举报
cppCH3构造函数与析构函数_第1页
第1页 / 共33页
cppCH3构造函数与析构函数_第2页
第2页 / 共33页
cppCH3构造函数与析构函数_第3页
第3页 / 共33页
cppCH3构造函数与析构函数_第4页
第4页 / 共33页
cppCH3构造函数与析构函数_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《cppCH3构造函数与析构函数》由会员分享,可在线阅读,更多相关《cppCH3构造函数与析构函数(33页珍藏版)》请在金锄头文库上搜索。

1、1,cppCH3构造函数与析构函数,自考,2,3.0 初始化、赋值的概念,1、初始化声明标识符(变量、对象、引用名)的同时给初值成为初始化。初始化的一般格式:数据类型 标识符=初始值或数据类型 标识符(初始值)例如:int i=0;或 int i(0);Location A(0,0);,3,3.0 初始化、赋值的概念,2、赋值在执行语句中,使用”=”表示赋值。赋值的一般形式:左值=右值例如:,int i;i=1;,Location A(0,0),B;B=A;,4,3.1 构造函数1,在C+语言中,可以使用初始化列表给没有定义构造函数的类的对象进行初始化。例如:有构造函数时,使用初始化列表则错当

2、数据成员的访问控制权限为私有时,使用初始化列表错,#includeclass Pointpublic: int X,Y; void display() coutX, Yendl;void main() Point A=1,2; A.display();,5,1、定义构造函数,1、构造函数的特点:(1)构造函数是和类名同名的成员函数;(2)定义构造函数时不能指定返回值类型;(3)当声明对象时,构造函数被系统自动调用来初始化对象。#includeclass Locationprivate:int X,Y;public:Location()X=Y=0;Location(int x,int y)X=x

3、;Y=y;int GetX()return X;int GetY()return Y;void main()Location A1(6,8);coutA1.GetX(),A1.GetY()1-,#includeclass Testprivate:int X;public:Test(int x=0)X=x;int GetValue()return X;void main()Test t2=1,2;/类具有单参数构造函数才可以这样用Test a2=Test(10),Test(20);for(int i=0;i2;i+)coutti.GetValue() ;for(i=0;i2;i+)coutai.

4、GetValue() ;,8,对象数组的创建2,当初始化的对象具有两个及以上参数时的形式,#includeclass Locationprivate:int X,Y;public:Location()X=Y=0;Location(int x,int y)X=x;Y=y;int GetX()return X;int GetY()return Y;void main()Location A2=Location(1,2),Location(3,4);for(int i=0;i2;i+)coutAi.GetX(),Ai.GetY()endl;,9,3、外部对象的引用性说明,全局对象或静态对象,在mai

5、n函数执行之前要调用所属类的构造函数来调用,#includeclass Testprivate:int X;public:Test(int x=0)X=x;coutInitializing.Xendl;int GetValue()return X;extern Test T;/这里只是引用性说明,没有创建对象void main()coutEntering mainendl;coutT.GetValue()endl;coutExiting mainendl;Test T(1);/这里创建了全局对象T,10,4、全局对象的创建,见“外部对象的引用性说明”的例子。,11,5、动态内存分配,(1)动态

6、对象的创建使用运算符new创建生存期可控的对象,new操作返回这个对象的地址。举例:讲解创建过程使用new操作建立的动态对象在不用时必须使用delete删除,以便释放所占空间。new创建对象时,自动调用构造函数来初始化申请的内存空间; delete释放所占空间时,自动调用析构函数。,Test *ptr1=new Test;Test *ptr2=new Test(5);delete ptr1;delete ptr2;,12,5、动态内存分配,(2)动态对象数组的创建new操作为每个对象元素申请内存空间,然后自动调用构造函数来依次初始化这块内存,最后new操作返回这个对象数组的首地址。举例:讲解创

7、建过程使用new操作建立的动态对象在不用时必须使用delete删除,以便释放所占空间。new创建对象数组时,自动调用构造函数来依次初始化申请的内存空间; delete操作时,自动调用析构函数来依次释放对象数组元素所占空间。,Test *ptr=new Test5;delete ptr;,13,3.1.3 缺省构造函数,1、缺省构造函数不带参数的构造函数称作缺省构造函数。例如:Test :Test()coutInitializing defaultendl;2、编译器生成缺省构造函数如果程序员没有为声明的类义任何构造函数,则编译器自动生成缺省构造函数如果程序员已经为类定义任何构造函数,则编译器不

8、再自动生成缺省构造函数编译器生成缺省构造函数举例:Test() 3、若没有为类定义缺省构造函数时,则在说明对象(对象数组)时必须提供初始值。4、当声明对象时,一定要保证对象能够被恰当的构造函数所创建。,14,3.1.4 复制初始化构造函数,赋制初始化构造函数:又称作拷贝构造函数。拷贝构造函数的一般语法形式:在拷贝构造函数中通过对象引用访问私有成员是允许的。拷贝构造函数会在如下三种情况下被调用:(1)当用一个类的对象去初始化另一个对象时;(2)如果函数的形参是类的对象,调用函数时,进行形参和实参结合时;(3)如果函数的返回值是类的对象,函数执行完成返回调用者时,类名:类名(类名 &r),15,(

9、1/3)当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝赋值。,#includeclass Point public: Point(int xx=0,int yy=0)X=xx; Y=yy; Point(Point,Point:Point (Point,16,(2/3)若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数,例如:void fun1(Point p) coutp.GetX( )endl; void main( ) Point A(1,2); fun1(A); /调用拷贝构造函数,17,(3/3)当函数的返回值是类对象时,系统自动调用拷贝构造函

10、数,例如:Point fun2( ) Point A(1,2); return A; /调用拷贝构造函数void main( ) Point B; B=fun2( ); ,18,拷贝构造函数-说明,当类中没有声明拷贝构造函数时,类中会自动生成一个默认拷贝构造函数。实现“浅拷贝”。这个默认拷贝构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。,19,3.2 析构函数,析构函数的功能:当对象消失时,系统自动调用析构函数,执行一些清理任务,例如释放由构造函数分配的内存(new)。3.2.1 定义析构函数3.2.2 析构函数和对象数组3.2.3 析构函数和

11、运算符delete3.2.4 缺省析构函数,20,3.2.1 定义析构函数,1、析构函数的特点:函数名、返回值、参数表2、析构函数的行为:当对象生存期结束时,程序为这个对象调用析构函数,然后收回这个对象占用的内存。3、全局对象和静态对象的析构函数在程序运行结束之前调用。4、当使用C+的系统函数exit终止一个程序运行时,也调用全局对象和静态对象的析构函数。举例理解:对象的创建和消亡(p44,test2.hp43),21,3.2.2 析构函数和对象数组,对象数组的创建:C+系统为每个对象数组元素调用构造函数对象数组的生命期结束时,C+系统为每个对象数组元素调用析构函数。举例理解(p45,test

12、2.hp43),22,3.2.3 析构函数和运算符delete,运算符delete删除一个对象时,它首先为这个动态对象调用析构函数,然后再释放这个对象占用的内存,这和使用new建立对象的过程正好相反。举例理解(p46,test2.hp43)普通动态对象的建立和删除动态对象数组的建立和删除,23,3.2.4 缺省析构函数,当定义类时没有定义析构函数,C+编译器会为这个类自动产生一个缺省析构函数。编译器自动产生的缺省析构函数形式如下:类名:类名()它的函数体是空的,即这个析构函数什么都不做。当这个类的对象生存期结束时,系统会自动来调用这个析构函数。,24,3.3 构造函数的类型转换,1、首先来看一

13、个示例程序Try=5;这个操作,是否合法取决于Test类当中有没有具有类型转换功能的构造函数,#includeclass Testprivate:int num;public:Test(int n=0)num=n;coutInitializing.numendl;void print()coutnumendl;Test()coutDestructing.numendl;void main()Test Try(0);Try=5;Try.print();Try=Test(10);Try.print();,25,2、P47-48,正确的注释如下: Initializing 0 /建立对象Try In

14、itializing 5 /建立隐藏对象 Destroying 5 / 析构新建的隐藏对象 5 / 输出Try对象的数据 Initializing 10 /由强制类型转换建立数据为10的对象 Destroying 10 / 析构新建的隐藏对象Try(num=10) 10 / 输出Try对象的数据 Destroying 10 / 析构Try对象,26,3、构造函数的类型转换功能,Try=Test(10);这个操作,是否合法取决于Test类当中有没有具有类型转换功能的构造函数。,#includeclass Testprivate:int num;char c;public:Test(int n=0,char c=0)num=n;Test:c=c;coutcendl;void print()coutnum cendl;Test()coutDestructing.numcendl;void main()Test Try;Try=Test(10,A);Try.print();,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号