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

时间:2012-08-16 18:19:56

标签: c++ constructor header

说我有这个班:

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

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

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

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

2 个答案:

答案 0 :(得分:16)

是。当initalizer列表中没有给出变量时,它会自动默认构造。

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

答案 1 :(得分:8)

来自§8.5

  

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

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

  

默认初始化T类型的对象意味着:
- 如果T是a   (可能是cv-qualified)类类型(第9节),默认构造函数   调用T(如果T没有,则初始化是错误的   可访问的默认构造函数);
- 如果T是数组类型,则每个   element是默认初始化的;
- 否则,没有初始化   执行。
如果程序要求默认初始化   一个const限定类型T的对象,T应该是一个带有a的类类型   用户提供的默认构造函数。

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

  

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