是否为成员变量自动调用默认构造函数
Are default constructors called automatically for member variables?
假设我有这个类:
//Awesome.h
class Awesome
{
public:
Awesome();
private:
membertype member;
}
//Awesome.cpp
#include "Awesome.h"
Awesome::Awesome()
:member()
{
}
如果我省略了Awesome
构造函数初始化列表中的member()
,member
的构造函数会自动调用吗?是否仅在初始化列表中不包含member
时才调用它?
是的。当初始器列表中未给出变量时,则默认自动构造该变量。
默认构造意味着,如果membertype
是class
或struct
,那么它将是默认构造的,如果它是一个内置数组,那么每个元素都将是默认构造的,如果是内置类型,则不会执行初始化(除非Awesome
对象具有静态或线程本地存储持续时间)。最后一种情况意味着成员变量可以(并且通常会)包含不可预测的垃圾,以防Awesome
对象是在堆栈上创建或在堆上分配的。
从 § 8.5
如果未为对象指定初始值设定项,则该对象为 默认初始化;如果未执行初始化,则具有 自动或动态存储持续时间具有不确定的值。[ 注: 具有静态或线程存储持续时间的对象初始化为零, 参见 3.6.2.—尾注 ]
更新以供将来参考:此外,默认初始化的含义定义为
默认初始化 T 类型的对象意味着:
— 如果 T 是 (可能符合 cv 标准)类类型(条款 9),默认构造函数 对于 T 被调用(如果 T 没有,则初始化格式不正确 可访问的默认构造函数);
— 如果 T 是数组类型,则每个 元素默认初始化;
— 否则,没有初始化 执行。
如果程序调用默认初始化 常量限定类型 T 的对象,T 应是具有 用户提供的默认构造函数。
此外,它与初始化的值不同,参考:-
对 T 类型的对象进行值初始化意味着:
— 如果 T 是 (可能符合 CV 标准)类类型(第 9 条),用户提供 构造函数 (12.1),则调用 T 的默认构造函数(和 如果 T 没有可访问的默认值,则初始化格式不正确 构造函数);
— 如果 T 是(可能符合 CV 条件的)非工会类 类型没有用户提供的构造函数,则对象为 零初始化,如果 T 隐式声明的默认构造函数 是非平凡的,该构造函数被调用。
— 如果 T 是一个数组 类型,然后每个元素都进行值初始化;
— 否则, 对象为零初始化。
- 如何在C++中调用默认模板功能参数?
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 没有用于调用默认构造函数的匹配函数
- 为什么指针对象没有调用默认构造函数
- 调用默认构造函数时不引用它
- 为什么我的对象声明不调用默认构造函数?
- 为什么要尝试调用默认构造函数?
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 是否可以从移动构造函数调用默认构造函数?
- 为什么类型变量;不调用默认 CTR
- 声明对象而不调用默认构造函数
- 作为参数的空初始值设定项列表不调用默认构造函数
- 如果类划分为单独的文件,则不调用默认构造函数
- 为什么"S x({})"仅在GCC 7/C++1z模式下调用默认构造函数?
- C++ 继承基构造函数,但仍调用默认派生构造函数
- 在返回语句中调用默认构造函数
- 在构造函数参数中调用默认构造函数
- 如何防止在基类初始化器中调用默认构造函数?
- 如何在以下C 代码中在同一对象上调用默认值和复制构造函数