关于default constructor一个要注意的地方.
看到“深度探索C++对象模型”中关于default constructor的描述:编译器会按照成员变量的声明次序来对成员变量初始化。突然有个想法:假设类中有两个成员变量A,B,其中A的初始化在需要B事先初始化好,而在声明中,A生命在B之后,这么做编译结果会不会出问题。试了一下,果然如此。代码如下 1
#include <stdio.h>
2
3
class A
4
{
5
public:
6
A(int _n)
7
{
8
n=_n;
9
printf("A %d\n",n);
10
}
11
int n;
12
};
13
14
class B
15
{
16
public:
17
B(A a)
18
{
19
printf("B=%d\n",a.n);
20
}
21
};
22
23
class C
24
{
25
public:
26
C()
27
{
28
printf("C\n");
29
}
30
};
31
32
class 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
45
void main()
46
{
47
ABC abc;
48
}
#include <stdio.h>2

3
class A4
{5
public:6
A(int _n)7
{8
n=_n;9
printf("A %d\n",n);10
}11
int n;12
};13

14
class B15
{16
public:17
B(A a)18
{19
printf("B=%d\n",a.n);20
}21
};22

23
class C24
{25
public:26
C()27
{28
printf("C\n");29
}30
};31

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

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

