1.构造函数
C++中的构造函数是用于初始化类的各种变量以及分配资源等。主要的注意事项是:
(1)在继承关系中先初始化父类对象后初始化子类对象。
(2)在一个类中按照变量的声明顺序,对类中的变量进行初始化。
(3)初始化过程中,可以使用已经被初始化的对象去初始化其他的对象。
2.析构函数
析构函数与构造函数作用相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
调用顺序与构造函数正好相反,先析构子类(释放子类资源),在析构父类(释放父类资源)。
3.虚析构函数
虚析构函数可以认为是特殊的析构函数,主要作用在继承关系中。
若B是A的子类: A *a=new B;
delete a;
如果A的析构函数是non-vartual,则只会调用A的析构函数,这样B的资源没有释放,就会有内存泄露;
如果A的析构函数是vartual,则只会先调用A的析构函数,再调用B的析构函数。
(见C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别)
4.代码示例
1 #include <iostream> 2 using namespace std; 3 class A{ 4 public: 5 A(int _a):a(_a){ 6 cout<<"A constructed function"<<endl; 7 } 8 9 virtual ~A(){ 10 cout<<"A destructor function"<<endl; 11 } 12 13 int getA(){ 14 return a; 15 } 16 private: 17 int a; 18 }; 19 20 class B:public A{ 21 public: 22 B(int _a,int _b):b(_b),A(_a){ 23 cout<<"B constructed function"<<endl; 24 } 25 26 ~B(){ 27 cout<<"B destructor function"<<endl; 28 } 29 30 int getAplusB(){ 31 return b+getA(); 32 } 33 private: 34 int b; 35 }; 36 37 int main(void) 38 { 39 B b(2,3); 40 cout<<b.getAplusB()<<endl; 41 cout<<"***********************************"<<endl; 42 A *a=new B(2,3); 43 cout<<"***********************************"<<endl; 44 delete a; 45 return 0; 46 }
执行输出: