考虑以下的类定义:C++构造函数隐式成员
class Foo {
private:
int a;
int b;
public:
Foo() :
a()
{}
};
如果我没有记错,a()
将调用int
默认的构造函数,并把它初始化为0。如果我离开了构造函数,它的不确定会发生什么到成员变量。但在这个例子中b
呢?对于我的gcc版本,它似乎也设置为0,但是是否定义了行为?
感谢您的回答。
考虑以下的类定义:C++构造函数隐式成员
class Foo {
private:
int a;
int b;
public:
Foo() :
a()
{}
};
如果我没有记错,a()
将调用int
默认的构造函数,并把它初始化为0。如果我离开了构造函数,它的不确定会发生什么到成员变量。但在这个例子中b
呢?对于我的gcc版本,它似乎也设置为0,但是是否定义了行为?
感谢您的回答。
b
将被初始化,所以试图使用它会导致UB(未定义的行为)。只是碰巧你的成员被gcc设置为零,但你不应该依赖这个。
事实上,如果你对所有的警告(-Wall -Wextra -Wpedantic
)编译,GCC试图做类似
cout << foo.b; // assuming b is public here
根据标准,当吐出
warning: 'foo.Foo::b' is used uninitialized in this function
,它是不确定的,并初始化为任何用来占用它现在占用的内存块的值。但是,一些编制者会自动将值初始化为该类型的零值。
看那接受这个问题的答案:
What happens to a declared, uninitialized variable in C? Does it have a value?