我发现许多文章解释了“默认初始化和值初始化”之间的区别,但实际上我并不清楚。
这是一个例子:
class A{
public:
int x;
};
int main(){
A a;// default initialization so x has undefined value.
A b = A(); // value initialization so x is a scalar thus it is value initialized to 0
}
在我看来还是可以的,但是在这里:
int value = 4; // is this considered a value-initialization?
请帮助我了解两种初始化形式之间的主要区别。
答案 0 :(得分:4)
x
为default initialization,因为效果是使用x
的默认构造函数进行初始化。由于A a;
的{{3}}不执行任何操作,因此A
的值不确定。
A
是implicitly-generated default constructor,
如果T是具有既不由用户提供也未删除的默认构造函数的类类型(也就是说,它可能是具有隐式定义或默认默认构造函数的类),则对象为value initialization并且那么如果它具有非平凡的默认构造函数,则为zero-initialized;
请注意与default-initialized的区别,a.x
具有隐式定义的默认构造函数,而对象是default initialization;因此临时对象A()
的数据成员A
将被初始化为x
。
A()
是zero-initialized,概念上的0
是从临时对象A b = A();
初始化的,所以b
也将被初始化为A()
。注意,由于copy initialization,由于C ++ 17 b.x
被保证直接为copy elision;复制/移动构造被省略。
0
也是value-initialized。 b
将被初始化为int value = 4;
。