【问题标题】:Are default constructors called automatically for member variables?是否为成员变量自动调用默认构造函数?
【发布时间】:2012-08-13 03:43:11
【问题描述】:

假设我有这门课:

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

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

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

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

【问题讨论】:

标签: c++ constructor header


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    从第 8.5 节开始

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

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

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

    此外,它与引用此初始化的值不同:-

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-12
      • 2018-05-13
      • 2022-06-15
      • 1970-01-01
      • 2016-01-27
      • 2018-11-24
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多