C++中的初始化

C++中的RAII机制指明”对象创建时通过构造函数进行初始化,析构时通过析构函数释放资源”,但实际中因类无构造函数时编译器将自动合成一个默认构造函数,该构造函数只服务于自身编译器构造需要而不负责对象成员构造,如这个实例中对象A成员val,next均未进行初始化,而对象B由于是类对象则调用其默认构造函数。但全局对象,静态对象编译器则自动进行将其初始化为0.

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class X {
 6 public:
 7     virtual void out() {
 8         cout << "class X" << endl;
 9     }
10 };
11 
12 class B :public X{
13 public:
14     int i;
15     ~B() 
16     {
17         cout << "~B()" << endl;
18     }
19 
20     virtual void out() {
21         cout << "class B" << endl;
22     }
23 };
24 
25 class A :public X{
26 public:
27     int val;
28     A *next;
29     B b;
30     virtual void out() {
31         cout << "class A" << endl;
32     }
33 };
34 
35 class C:public X {
36     X *px;
37 public:
38     C():px(new A()) {
39         px->out();
40     }
41     ~C() {
42         delete px;
43         cout << "~C()" << endl;
44     }
45 };
46 
47 A b;
48 static A c;
49 int main(int argc, char *argv[]) {
50 
51     A a;
52 
53     C d;
54     //d.C::C();
55     cout << a.val << ",next:" << a.next << ",i:" << a.b.i<< endl;
56     cout << b.val << ",next:" << b.next << ",i:" << b.b.i << endl; 
57     cout << c.val << ",next:" << c.next << ",i:" << c.b.i << endl; 
58 
59     d.~C();
60     d.~C();
61     cout << "finish." << endl;
62     return 0;
63 }

运行结果如下:

 1 test_con
 2 class A
 3 2009095316,next:0x77be2850,i:2009091625
 4 0,next:0,i:0
 5 0,next:0,i:0
 6 ~C()
 7 ~C()
 8 finish.
 9 ~C()
10 ~B()
11 ~B()
12 ~B()

实际中继承中虚表的构造通过在构造函数中完成,编译器自动将构造过程添加至构造函数前面如类C中,添加的构造函数通过内联展开才能满足非局部对象初始化不为0:

1 C():px(new A()) {
2         //构造虚表过程在此完成
3         px->out(); //此时已经实现虚表构造,调用多态化
4 }

posted on 2015-06-25 11:07  kkford  阅读(265)  评论(0编辑  收藏  举报

导航