成员变量会自动调用默认构造函数吗?

问题描述 投票:0回答:2

假设我有这门课:

//Awesome.h
class Awesome
{
    public:
        Awesome();
    private:
        membertype member;
}

//Awesome.cpp
#include "Awesome.h"

Awesome::Awesome()
:member()
{
}

如果我在

member()
的构造函数的初始化列表中省略
Awesome
member
的构造函数会被自动调用吗?只有当我在初始化列表中不包含
member
时才会调用它吗?

c++ constructor header
2个回答
22
投票

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

默认构造的意思是,如果

membertype
class
struct
,那么它将被默认构造,如果它是一个内置数组,那么每个元素将被默认构造,如果它是一个内置数组 -在类型中,则不会执行 初始化 (除非
Awesome
对象具有静态或线程本地存储持续时间)。最后一种情况意味着,如果
Awesome
对象是在堆栈上创建或在堆上分配的,则成员变量可以(并且通常会)包含不可预测的垃圾。


10
投票

来自 § 8.5

如果没有为对象指定初始值设定项,则该对象为 默认初始化;如果没有执行初始化,则对象具有 自动或动态存储持续时间具有不确定的值。 [ 笔记: 具有静态或线程存储持续时间的对象是零初始化的, 见 3.6.2。 ——尾注]

更新以供将来参考:进一步,默认初始化的含义定义为

默认初始化 T 类型的对象意味着:
如果 T 是一个 (可能是 cv 限定的)类类型(第 9 条),默认构造函数 for T 被调用(如果 T 没有,则初始化是错误的 可访问的默认构造函数);
— 如果 T 是数组类型,则每个 元素默认初始化;
— 否则,不进行初始化
如果程序调用默认初始化 const 限定类型 T 的对象,T 应是具有 用户提供的默认构造函数。

此外,它与参考此初始化的值有所不同:-

对 T 类型的对象进行值初始化意味着:
— 如果 T 是 (可能是 cv 限定的)类类型(第 9 条)以及用户提供的 构造函数(12.1),然后调用 T 的默认构造函数(并且 如果 T 没有可访问的默认值,则初始化是错误的 构造函数);
— 如果 T 是一个(可能是 cv 限定的)非联合类 类型没有用户提供的构造函数,那么该对象是 零初始化,并且如果 T 是隐式声明的默认构造函数 是不平凡的,该构造函数被调用。
— 如果 T 是一个数组 类型,则每个元素都被值初始化;
— 否则, 对象被零初始化。

© www.soinside.com 2019 - 2024. All rights reserved.