Lan*_*aru 13 c++ constructor header
说我有这个班:
//Awesome.h
class Awesome
{
public:
Awesome();
private:
membertype member;
}
//Awesome.cpp
#include "Awesome.h"
Awesome::Awesome()
:member()
{
}
Run Code Online (Sandbox Code Playgroud)
如果省略member()构造函数的初始化列表中Awesome,是否会member自动调用构造函数?它是否仅在我不包含member在初始化列表中时调用?
Ral*_*zky 16
是.当initalizer列表中没有给出变量时,它会自动默认构造.
默认构造意味着,如果membertype是a class或者struct,那么它将是默认构造的,如果它是内置数组,那么每个元素将是默认构造的,如果它是内置类型,则不会执行初始化(除非Awesomeobject具有静态或线程本地存储持续时间).最后一种情况意味着成员变量可以(并且经常会)包含不可预测的垃圾,以防Awesome对象在堆栈上创建或在堆上分配.
从§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是数组类型,则每个元素都是值初始化的;
- 否则,对象被零初始化.