关于default constructor一个要注意的地方.

看到“深度探索C++对象模型”中关于default constructor的描述:编译器会按照成员变量的声明次序来对成员变量初始化。突然有个想法:假设类中有两个成员变量A,B,其中A的初始化在需要B事先初始化好,而在声明中,A生命在B之后,这么做编译结果会不会出问题。试了一下,果然如此。代码如下
 1#include <stdio.h>
 2
 3class A
 4{
 5    public:
 6        A(int _n)
 7        {
 8            n=_n;
 9            printf("A %d\n",n);
10        }

11        int n;
12}
;
13
14class B
15{
16    public:
17        B(A a)
18        {
19            printf("B=%d\n",a.n);
20        }

21}
;
22
23class C
24{
25    public:
26        C()
27        {
28            printf("C\n");
29        }

30}
;
31
32class ABC
33{
34    public:
35    C c;
36    B b;
37    A a;
38    
39    ABC():a(1),b(a),c()
40    {
41        
42    }

43}
;
44
45void main()
46{
47    ABC abc;
48}

我本来想让b打印出B=1,结果却并非如此!
但如果将36,37行换过来,结果就对了!
对于程序员来讲,这点一定要注意,否则会带来奇怪的结果,而可恶的vc2005编译器竟然没有任何警告出现!

Powered by Jekyll and Theme by solid

本站总访问量