C ++初始化列出了多个初始化

时间:2013-05-26 17:13:48

标签: c++ initialization-list

C ++

#include <stdio.h>

class a
{ 
    public: 
        int var1; 
        a(int var) 
        {
            var1 = var; 
            printf("set var1 to %d\n", var1);
        } 
}; 
class b: public a 
{ 
    public: 
        int var2; 
        b(int d) : var2(d++), a(var2++)
        {
            printf("d: %d, var2: %d, var1: %d\n", d, var2, var1);
        } 
}; 

int main()
{ 
    int a = 5;
    b obj1(a);  
    printf("%d\n", obj1.var1);
} 

输出:

set var1 to 0
d: 6, var2: 5, var1: 0
0
[Finished in 0.7s]

为什么a.var1未设置为6?

1 个答案:

答案 0 :(得分:4)

因为C ++忽略了列出成员初始化的顺序。在初始化其他成员之前,总是调用基类ctor。 *

所以我相信你在这里调用未定义的行为;你传递var2作为ctor参数,但它尚未初始化。

<小时/> *如果您允许,编译器应该警告您。例如,使用带有-Wall标志的GCC编译代码会显示以下消息:

test.cc: In constructor "b::b(int)":
test.cc:16: error: "b::var2" will be initialized after
test.cc:17: error:   base "a"
test.cc:17: error:   when initialized here