C++构造函数、析构函数、虚析构函数

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 }

 执行输出:

 

posted on 2014-03-12 21:21  旭东的博客  阅读(3152)  评论(1编辑  收藏  举报

导航