对于有确切默认初始值的对象,一般来说使用是安全的;对于默认初始值随机化的对象,使用起来就得小心,需要明确初始化之后再使用,不要依赖于编译器的默认行为。
int x;
std::string s;
std::cout << x << std::endl; // -340157392, this is a random value
std::cout << '{' << s << '}' << std::endl; // {}, this is an empty string
类标量数据成员的初始化:
- 数据成员默认初始化
struct Foo {
int v = 0;
};
- 构造函数初始化
struct Foo {
Foo() : v(0) {}
int v;
};
struct Foo {
Foo() {v=0;}
int v;
};
// v is not initialized
struct Foo {
Foo() {}
int v;
};
=default
默认构造函数声明:
- 在类内部使用
=default
声明默认构造函数,不属于用户自定义的构造函数 - 在类外部使用
=default
定义默认构造函数,属于用户自定义的构造函数
struct Foo {
Foo() = default; // this is not user defined ctor
int v;
};
struct Bar {
Bar();
int v;
};
Bar::Bar() = default; // this is a user defined ctor
int main() {
Foo f = {}; // Foo is aggregate type, and f.v is zero initialized
Bar b = {}; // Bar is not aggregate type, and b.v is not initialized
}
聚合 (Aggregate)
类型
- 数组是聚合类型
- 类或者结构体需要满足 (就是可以使用
memcpy, memset
来拷贝和零初始化的类型):- 所有的成员都是
public
的 - 没有静态数据成员
- 没有用户定义的构造函数
- 没有基类
- 没有虚函数
- 没有成员默认初始化定义
- 所有的成员都是