c++构造函数和析构函数

上传人:第*** 文档编号:54415077 上传时间:2018-09-12 格式:PPT 页数:50 大小:205.50KB
返回 下载 相关 举报
c++构造函数和析构函数_第1页
第1页 / 共50页
c++构造函数和析构函数_第2页
第2页 / 共50页
c++构造函数和析构函数_第3页
第3页 / 共50页
c++构造函数和析构函数_第4页
第4页 / 共50页
c++构造函数和析构函数_第5页
第5页 / 共50页
点击查看更多>>
资源描述

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

1、,第二部分面向对象程序设计,第十一章 构造函数和析构函数,11,11.1 类与对象,第十一章 目 录,11.3 析构函数,11.2 构造函数,11.4 带参数的构造函数,11.5 重载构造函数,11.6 缺省构造函数,第十一章小结,11.7 拷贝构造函数,11.8 拷贝构造函数的其他用处,C+ 中构造函数和析构函数是类的特殊成员函数。构造函数用于创建类对象,初始化其成员。析构函数用于撤销类对象。本章介绍构造函数、析构函数、缺省构造函数、拷贝构造函数等相关内容。,第十一章 构造函数和析构函数,一个类描述一类事物,描述这些事物所应具有的属性。对象是类的一个实例,它具有确定的属性。如学生类与某学生对

2、象。类的名字只有一个,但由该类创建的对象可以任意多个。属于不同类的对象可以在不同时刻、不同环境分别创建或撤销。与定义变量相同,可定义具有不同存储属性的各类对象。定义对象时,C+ 编译器为其分配存储空间(如果需要)。,11.1 类与对象,例如:下面程序定义了两个类,创建了全局对象和局部对象,静态对象和堆对象。class Desk /define class Deskpublic:int weight;int high;int width;int length;class Stool /define class Stoolpublic:int weight;int high;,int width;

3、int length; ;Desk da; /globle object da Stool sa; /globle object savoid fn() static Stool ss; /local static objectDesk da; /local object/ void main() Stool bs; /local objectDesk *pd=new Desk; /heap object,Desk nd50; /local array of object/delete pd; /clean up object and release resources 前面已经介绍过变量定义

4、时若未显式初始化,全局变量和静态变量在定义时初值为0,局部变量在定义时初值为随机数。与定义变量不同,一旦建立一个对象,对象通常都需要有一个有意义的初值。C+ 建立和初始化对象的过程专门由该类构造函数完成。对象建立时,调用该构造函数,给对象分配存储空间并进行初始化。当对象撤销时,调用析构函数作善后处理。,11.2 构造函数,类创建对象时需要对对象初始化,但初始化任务,只有由成员函数完成,因此,在类中必须定义一个具有初始化功能的成员函数。每当创建一个对象时,就调用这个成员函数,实现初始化。例如:class Studentpublic:void init()semeshours=100;gpa=3.

5、5;,/protected:int semeshours;int gpa;void fn()Student s;s.init(); /调用类的初始化函数/这种将初始化工作交由初始化成员函数完成的方式使系统多了一道处理过程,增加了书写代码,实现的机制并不理想。,另一种方法是建立对象的同时,自动调用构造函数,省去上述麻烦,使定义类对象时包含了为对象分配存储空间和初始化的双重任务。这种实现机制较为理想。由于类的唯一性和对象的多样性,因此C+ 规定构造函数与类同名。其特点是:Constructor is a function with the explicit purpose of initializ

6、ing object.Because such a function constructs values of a given type, it is called a constructor.A constructor is recognized by having the same name as the class itself.When a class has a constructor, all objects of that class will be initialized by a constructor call.,构造函数的使用方式有:构造函数在类体内定义,例如:#incl

7、ude class Desk public:Desk()weight=10;high=5;width=5;length=5;protected:int weight;int high;,int width;int length; ;void fn() Desk da; /constructor call/ ,构造函数可以在类体外定义,例如:#include class Desk public:Desk();,protected:int weight;int high;int width;int length; ;Desk:Desk() /constructor definition weigh

8、t=10;high=5;width=5;length=5;coutweight“ ”high“ ”width“ ”lengthendl; ;,void fn() Desk da; void main() fn(); 结果: 10 5 5 5,da 对象的内存空间分配及初始化,weight,high,width,length,da,若将fn() 函数改为void fn() Desk dd5; 则执行定义数组语句时,构造 函数将被调用5 次,即对每个 数组成员对象的创建都要调用 一次构造函数。,weight,high,width,length,weight,high,width,length,dd

9、0,dd4,dd5 对象的内存空间分配及初始化,输出结果为: 5 5 5 10 5 5 5 5 5 5 10 5 5 5 10 5 5 5,注意:1、类体外定义构造函数,其函数名前要加上“类名:”;2、构造函数无返回类型;3、在定义时,若类的数据成员是另一个类的对象,则在调用构造函数创建对象时,对作为数据成员的对象先要自动调用其自身的构造函数。下面程序的Tutorpair类(“帮教派对”)中,其成员包含有学生类对象和老师类对象。程序说明了调用构造函数的方法。,/ch11-5.cpp #include class Student public:Student()cout“Constructing

10、 student.n”;semeshours=100;gpa=3.5;/protected:int semeshours;float gpa; ;,class Teacher public:Teacher()cout“Constructing teacher.n”; ;class Tutorpair public:Tutorpair()cout“Constructing tutorpair.n”;nomeetings=0;,protected:Student student; /class object as member dataTeacher teacher; /class object

11、as member dataint nomeetings; ;void main() Tutorpair tp;cout“Back in main.n”; ,运行结果: Constructing student. Constructing teacher. Constructing Tutorpair. Back in main.,当调用构造函数Tutorpair() 创建的对象tp 时,首先根据对象成员被说明的次序,依次调用Student() 构造函数和Teacher() 构造函数创建成员对象Student 和Teacher,然后执行它自己的构造函数的函数体,如运行结果所示。,The con

12、structor is used to initialize objects, and destructor is used to clean up objects and release resources before they are become unusable.例如在下面情况下需要使用析构函数:一个对象当结束其生命期时,比如在函数体内定义的对象,当该函数调用结束时,局部对象被释放。构造函数打开一个文件,使用完文件时,需要关闭文件。从堆中分配了动态内存区,在对象消失之前必须释放。,11.3 析构函数,析构函数的特点:无返回类型;无参数;不能随意调用;不能重载。而构造函数可以有参数,也

13、可以重载。析构函数与构造函数的功能相对应,所以析构函数名是构造函数名前加一个逻辑反运算符“”,例如:下面程序段在class Xyz 类中定义了一个构造函数和一个析构函数。class Xyz public:Xyz() /constructor definitionname=new char20;Xyz() /destructor definitiondelete name;protected:char *name; ,该类定义的构造函数在对象之外分配一段堆内存空间,撤销时,由析构函数收回堆内存。注意,析构函数以调用构造函数相反的顺序被调用。例如:在ch11-5.cpp 程序中为每个类增加析构函数

14、则有:/ch11-7.cpp #include class Student public:Student()cout“Constructing student.n”;semeshours=100;gpa=3.5;,Studeng()cout “Destructing student.n”;protected:int semeshours;float gpa; ;class Teacher public:Teacher()cout“Constructing teacher.n”;,Teacher()cout “Destructing teacher.n”; ;class Tutorpair pu

15、blic:Tutorpair()cout“Constructing tutorpair.n”;nomeetings=0;Tutorpair()cout“Destructing tutorpair.n”;,protected:Student student;Teacher teacher;int nomeetings; ;void main() Tutorpair tp;cout“Back in main.n”; ,Constructing student.,Constructing teacher.,Constructing tutorpair.,Back in main.,Destructing tutorpair.,Destructing teacher.,Destructing student.,运行结果:,不带参数的构造函数不能完全满足初始化的要求,因为这样创建的类对象具有相同的初始化值。如果需要对类对象按不同特征初始化不同的值,应采用带参数的构造函数。如下面程序所示:/tdate1.hclass Tdate1public:Tdate1(int y,int m,int d);Tdate1();void print();,

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

当前位置:首页 > 建筑/环境 > 工程造价

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