17

说我有这门课:

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

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

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

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

4

2 回答 2

20

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

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

于 2012-08-16T18:22:58.587 回答
10

从§ 8.5

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

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

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

此外,它与初始化的值不同,指的是:-

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

于 2012-08-16T18:30:11.033 回答