2012-08-16 98 views
7

说我有这个类:为成员变量自动调用默认构造函数吗?

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

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

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

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

+0

可能重复的[C++类成员的默认值](http://stackoverflow.com/questions/2614809/what-is-the-default-value-for-c-class-members ) – FailedDev 2012-08-16 18:23:40

+0

取决于'membertype',但通常是。 – AJG85 2012-08-16 18:33:17

回答

7

从§8.5

如果对象没有指定初始化,对象是 缺省初始化;如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值。 [注: 具有静态或线程存储时间的对象是零初始化的, 见3.6.2。末端音符]

更新以备将来参考:进一步缺省初始化定义的含义

为默认初始化类型T的对象是指:
- 如果T是一个如果T没有 可访问的默认构造函数,则调用T的默认构造函数 (并且初始化不合格);
- 如果T是一个数组类型,则每个 元素都被默认初始化;
- 否则,不会执行初始化 。
如果一个程序要求默认初始化 一个const限定类型T的对象,T应该是一个具有用户提供的默认构造函数的类类型。

此外它从值变化初始化参照此: -

要值初始化类型T的对象是指:
- 如果T是 (可能CV修饰)类型(第9章)与用户提供的 构造函数(12。1),那么T的默认构造函数被调用(并且 ,如果T没有可访问的默认构造函数 ,则初始化不合格);
- 如果T是没有用户提供的构造函数的(可能是cv合格的)非联合类 类型,则该对象是 零初始化,并且如果T隐含声明的默认构造函数 不重要,则该构造函数叫做。
- 如果T是一个数组 类型,则每个元素都进行了值初始化;
- 否则, 对象将被初始化为零。

13

是的。当初始化列表中没有给出变量时,它是默认自动构建的。

默认敷设渠道装置,即如果membertypeclassstruct,那么这将是默认池莉构建,如果它是一个内置的阵列,则每个元素将被默认构造和如果它是一个内部类型,那么将不会执行初始化(除非Awesome对象具有静态或线程本地存储持续时间)。最后一种情况意味着,如果Awesome对象在堆栈上创建或在堆上分配,则该成员变量可以(并且通常会)包含不可预知的垃圾。