分类: C/C++
2013-01-25 16:36:14
1.没有派生类的,类的构造函数与析构函数
class Base { public: Base(){ i_num = 3; i_count = 5;//错误,不能对常量进行赋值 } Base(int i,int j):i_num(i),i_count(j) { str= new char[64]; }; ~Base(){ delete str; }; pravite: int i_num; const int i_count; char* str; };
构造函数是给数据成员进行初始化或赋值的。既然能够赋值,为什么还要有初始化列表呢?因为,对于const或引用型数据成员,赋值是错误的。初始化这类数据只有在初始化列表中。当自定义构造函数时,默认构造函数不在被调用。
析构函数是为了释放资源。对于从堆上申请的内存,必须自定义析构函数来释放掉这块内存,否则内存泄露。对于其他地方的内存空间有默认析构函数自动释放。当一个对象生命周期结束时,首先调用自定义析构函数,然后再调用默认析构函数。
2.有派生类的,基类和派生类的构造函数与析构函数
构造函数的先后顺序:先调用基类的构造函数,然后再调用派生类的构造函数。
析构函数的先后顺序和构造函数的相反。
派生类的构造函数只能初始化本类成员,不能直接初始化基类成员。基类成员由基类构造函数进行初始化。
下面,让我们看一个virtual 虚构函数的例子。
这样就得出一个结论,当你的基类的析构函数不为虚的话: