这是关于 C++ 中初始化相关内容的详细解释,主要包括以下几个方面:
- 初始化类型:主要有默认初始化(default-initialization)和值初始化(value-initialization),标准中规则大致如下:对于任何类型
T
,T t;
进行默认初始化,类类型且有默认构造函数则运行它,数组类型则初始化每个元素,否则不做处理;T t{};
进行值初始化,类类型若无默认构造函数或用户提供/删除的默认构造函数则默认初始化,否则零初始化然后默认初始化,数组类型则初始化每个元素,否则零初始化。 - 默认构造函数:不声明构造函数时,编译器会声明默认构造函数,分为隐式声明和首次声明时默认,隐式声明或显式默认(未定义为删除)的默认构造函数会由编译器提供,实现上等效于空体和空成员初始化列表。但在某些情况下编译器无法提供合理的默认构造函数,会将隐式声明的默认构造函数定义为删除,如类有非静态引用成员、非静态成员或非抽象基类不可合理默认构造或销毁、有
const
非静态不可默认构造成员等。 - 初始化方式:通常写
T t{};
时首先进行列表初始化(list-initialization),对于聚合类型(数组或满足特定条件的类)进行聚合初始化(aggregate initialization),否则对于非聚合类类型,若初始化器为空且有默认构造函数则进行值初始化,否则根据重载决议考虑其他构造函数。列表初始化还有直接列表初始化(direct-list-initialization)和复制列表初始化(copy-list-initialization)等形式,括号初始化(parenthesized expression-list initializer)与花括号初始化功能不同,允许窄化转换等,且元素求值顺序无保证。 - 关键建议:最好自己编写构造函数,避免让编译器去推断,否则可能会引入未定义行为,如在代码中添加了六个未定义行为实例,可能导致安全问题。
总之,理解不同的初始化方式和规则对于编写正确的 C++ 代码非常重要。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。