首页 > 解决方案 > 关于c++中类初始化的问题

问题描述

我正在学习 c++,我发现了一些让我困惑的东西,它是关于类中数据成员的初始化。

给定这个例子:

class son
{
public:
    son(){
        std::cout << "constructing class son" << std::endl;
    }
};

class father
{
public:
    father(){
        std::cout << "constructing class father" << std::endl;
    }

private: 
    son s;
};

int main( int argc, char *argv[] ){
    father f; 
}

输出是:

constructing class son
constructing class father

我不明白为什么要son初始化该类。假设 in 的声明father是声明,必须在构造函数中提供适当的初始化 father()才能初始化,但在 class 的情况下似乎不需要。真的吗?

标签: c++oopc++17

解决方案


看看cppreference对构造函数的描述,尤其是关于成员初始化器列表的部分。

在构成构造函数的函数体的复合语句开始执行之前,所有直接基、虚拟基和非静态数据成员的初始化都已完成。成员初始化器列表是可以指定这些对象的非默认初始化的地方。

初始化顺序列表中的成员初始化器的顺序无关紧要:实际的初始化顺序如下:

  1. 如果构造函数是用于最派生类的,则虚基按照它们在基类声明的深度优先从左到右遍历中出现的顺序进行初始化(从左到右是指出现在基类声明中)说明符列表)
  2. 然后,直接基以从左到右的顺序初始化,因为它们出现在此类的基说明符列表中
  3. 然后,按照类定义中的声明顺序初始化非静态数据成员。
  4. 最后执行构造函数的主体

在这种情况下,我们实际上只查看第 3 行和第 4 行,因为没有继承。

关键点是每个成员变量在进入构造函数的主体之前被初始化,无论是默认初始化还是根据成员初始化列表中的值。由于father::father没有,它默认初始化s


推荐阅读