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

本文探讨了C++中默认构造函数对成员变量初始化的顺序问题。通过具体示例展示了当成员变量A依赖于成员变量B时,若A在B之后声明但需要先于B初始化,则会导致编译错误。文章强调了正确理解构造函数调用顺序的重要性。
看到“深度探索C++对象模型”中关于default constructor的描述:编译器会按照成员变量的声明次序来对成员变量初始化。突然有个想法:假设类中有两个成员变量A,B,其中A的初始化在需要B事先初始化好,而在声明中,A生命在B之后,这么做编译结果会不会出问题。试了一下,果然如此。代码如下
 1None.gif#include <stdio.h>
 2None.gif
 3None.gifclass A
 4ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 5InBlock.gif    public:
 6InBlock.gif        A(int _n)
 7ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 8InBlock.gif            n=_n;
 9InBlock.gif            printf("A %d\n",n);
10ExpandedSubBlockEnd.gif        }

11InBlock.gif        int n;
12ExpandedBlockEnd.gif}
;
13None.gif
14None.gifclass B
15ExpandedBlockStart.gifContractedBlock.gifdot.gif{
16InBlock.gif    public:
17InBlock.gif        B(A a)
18ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
19InBlock.gif            printf("B=%d\n",a.n);
20ExpandedSubBlockEnd.gif        }

21ExpandedBlockEnd.gif}
;
22None.gif
23None.gifclass C
24ExpandedBlockStart.gifContractedBlock.gifdot.gif{
25InBlock.gif    public:
26InBlock.gif        C()
27ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
28InBlock.gif            printf("C\n");
29ExpandedSubBlockEnd.gif        }

30ExpandedBlockEnd.gif}
;
31None.gif
32None.gifclass ABC
33ExpandedBlockStart.gifContractedBlock.gifdot.gif{
34InBlock.gif    public:
35InBlock.gif    C c;
36InBlock.gif    B b;
37InBlock.gif    A a;
38InBlock.gif    
39InBlock.gif    ABC():a(1),b(a),c()
40ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
41InBlock.gif        
42ExpandedSubBlockEnd.gif    }

43ExpandedBlockEnd.gif}
;
44None.gif
45None.gifvoid main()
46ExpandedBlockStart.gifContractedBlock.gifdot.gif{
47InBlock.gif    ABC abc;
48ExpandedBlockEnd.gif}

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

转载于:https://www.cnblogs.com/cutepig/archive/2009/03/21/1418191.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值