是否为成员变量自动调用默认构造函数

Are default constructors called automatically for member variables?

本文关键字:调用 默认 构造函数 成员 变量 是否      更新时间:2023-10-16

假设我有这个类:

//Awesome.h
class Awesome
{
    public:
        Awesome();
    private:
        membertype member;
}
//Awesome.cpp
#include "Awesome.h"
Awesome::Awesome()
:member()
{
}

如果我省略了Awesome构造函数初始化列表中的member()member的构造函数会自动调用吗?是否仅在初始化列表中不包含member时才调用它?

是的。当初始器列表中未给出变量时,则默认自动构造该变量。

默认构造意味着,如果membertypeclassstruct,那么它将是默认构造的,如果它是一个内置数组,那么每个元素都将是默认构造的,如果是内置类型,则不会执行初始化(除非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 是一个数组 类型,然后每个元素都进行值初始化;
— 否则, 对象为零初始化。