C++中的默认初始化
Default initialization in C++
今天早上我问自己一些问题,但我找不到合适的单词来"谷歌":
假设我有:
struct Foo
{
int bar;
};
struct Foo2
{
int bar;
Foo2() {}
};
struct Foo3
{
int bar;
Foo3() : bar(0) {}
};
现在,如果我默认实例化Foo
、Foo2
和Foo3
:
Foo foo;
Foo2 foo2;
Foo3 foo3;
在哪种情况下,bar
成员已正确初始化?
(很明显,Foo3
明确地初始化了它,这里只显示了与Foo2
的区别,所以问题主要是关于前两个。)
谢谢!:)
所有上下文中只有foo3。如果foo2和foo是静态持续时间,则它们将是。注意,Foo类型的对象在其他上下文中可能是零初始化的:
Foo* foo = new Foo(); // will initialize bar to 0
Foo* foox = new Foo; // will not initialize bar to 0
而Foo2不会:
Foo2* foo = new Foo2(); // will not initialize bar to 0
Foo2* foox = new Foo2; // will not initialize bar to 0
这个领域很棘手,措辞在C++98和C++03之间发生了变化,IIRC又用了C++0X,所以我不依赖它。
带
struct Foo4
{
int bar;
Foo4() : bar() {}
};
条也将始终初始化。
由于bar
是内置类型,因此Foo1
和Foo2
的默认初始化将未定义。如果它是一个自定义类型,那么就会调用默认构造函数,但这里的情况并非如此。
教训:始终初始化变量。
用例3是正确的方法,它有一个成员初始化列表。
前两个都不会被正确初始化,因为你没有给它们一个初始值(就像只定义的变量没有初始化一样)。
对于pod类型,默认初始化为零初始化。
因此:
Foo() : b() {}
与Foo() : b(0) {}
相同
我找不到C++标准的各个部分,但如果完全跳过初始化器,那么POD类型就不应该默认初始化(不像非POD类型那样)。
因此,在您的情况下,只有第三个示例被正确初始化。
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 副本初始化的默认模板参数推导
- 使用 std::分配器在 constexpr 中进行默认初始化
- 在C++中使用默认构造函数初始化对象的不同方法
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数时使用垃圾数据初始化对象
- 为什么对象默认初始化,但基元不在C++?
- 默认参数和空列表初始化
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- C++中未初始化成员布尔变量的默认值是多少?
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 默认初始化无法正常工作
- 如何用默认值0或-1初始化unordered_set
- C++11 默认类成员初始化与初始值设定项列表同时
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在皮条类中初始化默认值的最佳位置
- 值初始化:默认初始化或零初始化