2022年2022年类的构造函数和析构函数 .pdf
《2022年2022年类的构造函数和析构函数 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年类的构造函数和析构函数 .pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+面向对象编程入门:构造函数与析构函数请注意,这一节内容是c+的重点,要特别注意!我们先说一下什么是构造函数。上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在 c+中对于类来说有没有更方便的方式能够在对象创建的时候就自动初始化成员变量呢,这一点对操作保护成员是至关重要的,答案是肯定的。关于c+类成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用,在正式讲解之前先看看c+对构造函数的一个基本定义。1.C+规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。2.若没有提供任何构造函数,那么c+提
2、供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。3.只要类中提供了任意一个构造函数,那么c+就不在自动提供默认构造函数。4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。我们来看下面的代码:#include using namespace std; class Student public: Student()/无参数构造函数 number = 1; score = 100; void show(); protected: int number;
3、 int score; ; void Student:show() coutnumberendlscoreendl; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - void main() Student a; a.show(); cin.get(); 在类中的定义的和类名相同,并且没有任何返回类型的Student()就是构造函数, 这是一个无参数的构造函数,他在对象创建的时候自动调用,如果去掉 Student()函数体内的代
4、码那么它和 c+的默认提供的构造函数等价的。构造函数可以带任意多个的形式参数,这一点和普通函数的特性是一样的!下面我们来看一个带参数的构造函数是如何进行对象的始化操作的。代码如下:#include using namespace std; class Teacher public: Teacher(char *input_name) /有参数的构造函数 name=new char10; /name=input_name;/ 这样赋值是错误的strcpy(name,input_name); void show(); protected: char *name; ; void Teacher:sh
5、ow() coutnameendl; void main() /Teacher a;/这里是错误的 ,因为没有无参数的构造函数Teacher a(test); a.show(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - cin.get(); 我们创建了一个带有字符指针的带有形参的Teacher(char *input_name) 的构造函数,调用它创建对象的使用类名加对象名称加扩号和扩号内参数的方式调用,这和调用函数有
6、点类似,但意义也有所不同,因为构造函数是为创建对象而设立的,这里的意义不单纯是调用函数,而是创建一个类对象。一旦类中有了一个带参数的构造函数而又没无参数构造函数的时候系统将无法创建不带参数的对象,所以上面的代码Teacher a; 就是错误的! ! !这里还有一处也要注意:/name=input_name;/ 这样赋值是错误的因为 name指是指向内存堆区的,如果使用name=input_name;会造成指针指向改变不是指向堆区而是指向栈区,导致在后面调用析构函数delete 释放堆空间出错!(析构函数的内容我们后面将要介绍) 如果需要调用能够执行就需要再添加一个没有参数的构造函数对上面的代码
7、改造如下:#include using namespace std; class Teacher public: Teacher(char *input_name) name=new char10; /name=input_name;/ 这样赋值是错误的strcpy(name,input_name); Teacher()/无参数构造函数,进行函数重载 void show(); protected: char *name; ; void Teacher:show() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
8、 - - - - - - 第 3 页,共 14 页 - - - - - - - - - coutnameendl; void main() Teacher test; Teacher a(test); a.show(); cin.get(); 创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类添加任意多个构造函数,来使用不同的参数来进行初始话对象。现在我们来说一下,一个类对象是另外一类的数据成员的情况,如果有点觉得饶人那么可以简单理解成:类成员的定义可以相互嵌套定义,一个类的成员可以用另一个类进行定义声明。
9、c+规定如果一个类对象是另外一类的数据成员,那么在创建对象的时候系统将自动调用那个类的构造函数。下面我们看一个例子。代码如下:#include using namespace std; class Teacher public: Teacher() director = new char10; strcpy(director, 王大力 ); char *show(); protected: char *director; ; char *Teacher:show() return director; class Student public: 名师资料总结 - - -精品资料欢迎下载 - -
10、- - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - Student() number = 1; score = 100; void show(); protected: int number; int score; Teacher teacher;/这个类的成员teacher是用 Teacher类进行创建并初始化的; void Student:show() coutteacher.show()endlnumberendlscoreendl; void main() Student
11、 a; a.show(); Student b5; for(int i=0; i sizeof(b)/sizeof(Student); i+) bi.show(); cin.get(); 上面代码中的Student 类成员中 teacher成员是的定义是用类Teacher进行定义创建的,那么系统碰到创建代码的时候就会自动调用Teacher类中的 Teacher()构造函数对对象进行初始化工作!这个例子说明类的分工很明确,只有碰到自己的对象的创建的时候才自己调用自己的构造函数。一个类可能需要在构造函数内动态分配资源,那么这些动态开辟的资源就需要在对象不复存在之前被销毁掉,那么c+类的析构函数就提
12、供了这个方便。析构函数的定义:析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。析构函数与构造函数最主要大不同就是在于调用期不同,构造函数可以有参数可以重载!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - 我们前面例子中的Teacher类中就使用new 操作符进行了动态堆内存的开辟,由于上面的代码缺少析构函数,所以在程序结束后,动态开辟的内存空间并
13、没有随着程序的结束而小时, 如果没有析构函数在程序结束的时候逐一清除被占用的动态堆空间那么就会造成内存泄露,使系统内存不断减少系统效率将大大降低!那么我们将如何编写类的析构函数呢?析构函数可以的特性是在程序结束的时候逐一调用,那么正好与构造函数的情况是相反,属于互逆特性, 所以定义析构函数因使用符号(逻辑非运算符),表示它为腻构造函数,加上类名称来定义。看如下代码:#include #include using namespace std; class Teacher public: Teacher() director = new char10; strcpy(director, 王大力 )
14、; /director = new string; / *director= 王大力 ;/string 情况赋值 Teacher() cout 释放堆区 director 内存空间 1次; delete director; cin.get(); char *show(); protected: char *director; /string *director; ; char *Teacher:show() return director; class Student public: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
15、- 名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - - - Student() number = 1; score = 100; void show(); protected: int number; int score; Teacher teacher; ; void Student:show() coutteacher.show()endlnumberendlscoreendl; void main() Student a; a.show(); Student b5; for(int i=0; i sizeof(b)/sizeof(Stude
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年类的构造函数和析构函数 2022 构造 函数
限制150内