c++规定如果一个类对象是另外一类的数据成员,那么在创建对象的时候系统将自动调用那个类的构造函数。
析构函数的定义:析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。
我们前面例子中的Teacher类中就使用new操作符进行了动态堆内存的开辟,由于上面的代码缺少析构函数,所以在程序结束后,动态开辟的内存空间并没有随着程序的结束而小时,如果没有析构函数在程序结束的时候逐一清除被占用的动态堆空间那么就会造成内存泄露,使系统内存不断减少系统效率将大大降低!
c++规定,所有的全局对象和全局变量一样都在主函数main()之前被构造,函数体内的静态对象则只构造一次,也就是说只在首次进入这个函数的时候进行构造!
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; class Teacher { public: Teacher() { director = ]; strcpy(director,"王大力"); printf("func:%s %d\n", __FUNCTION__, __LINE__); cout << "TEACHER()" << endl; printf("func:%s %d\n", __FUNCTION__, __LINE__); } ~Teacher(){ cout<<"释放堆区director内存空间1次"; delete[] director; cout << "~TEACHER()" << endl;} char *show(); protected: char *director; }; char *Teacher::show() { printf("func:%s %d\n", __FUNCTION__, __LINE__); cout << "TEACHER::show()" << endl; printf("func:%s %d\n", __FUNCTION__, __LINE__); return director; } class Student { public: Student() { number = ; score = ; printf("func:%s %d\n", __FUNCTION__, __LINE__); cout << "STUDENT()" << endl; printf("func:%s %d\n", __FUNCTION__, __LINE__); } ~Student(){cout << "~STUDENT()" << endl;} void show(); protected: int number; int score; Teacher teacher;//这个类的成员teacher是用Teacher类进行创建并初始化的 }; void Student::show() { cout<< "STUDENT::show()" << teacher.show()<< " " <<number<<" "<<score<<endl; } int main() { Student a; a.show(); Student b[]; ; i<sizeof(b)/sizeof(Student); i++) { b[i].show(); } //cin.get(); }
func:Teacher 12
TEACHER()
func:Teacher 14
func:Student 38
STUDENT()
func:Student 40
func:show 26
TEACHER::show()
func:show 28
STUDENT::show()王大力 1 100
func:Teacher 12
TEACHER()
func:Teacher 14
func:Student 38
STUDENT()
func:Student 40
func:Teacher 12
TEACHER()
func:Teacher 14
func:Student 38
STUDENT()
func:Student 40
func:show 26
TEACHER::show()
func:show 28
STUDENT::show()王大力 1 100
func:show 26
TEACHER::show()
func:show 28
STUDENT::show()王大力 1 100
~STUDENT()
释放堆区director内存空间1次~TEACHER()
~STUDENT()
释放堆区director内存空间1次~TEACHER()
~STUDENT()
释放堆区director内存空间1次~TEACHER()
Press <RETURN> to close this window...