成员初始化程序的顺序

MSC

以下代码给出正确的输出,如果我声明变量ijint i, j;

class A 
{
  int i, j;

public:
    A(int val) : i(val), j(i + 1)
    {
        cout<<i<<endl<<j<<endl;
    }
};

但是如果我声明变量ij,就像int j, i;然后j打印垃圾值

class A 
{
  int j, i;

public:
    A(int val) : i(val), j(i + 1)
    {
        cout<<i<<endl<<j<<endl;
    }
};

那么,它取决于变量声明的顺序吗?

songyuanyao

它取决于变量声明的顺序吗?

是的,数据成员始终按照其声明顺序进行初始化,这与成员初始化程序列表的顺序无关。

这意味着对于您的第二个代码段,j始终在i;之前进行初始化但是当由成员初始i值设定项初始化时,仍未初始化。

对象的完整初始化顺序为:

(强调我的)

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

1)如果构造函数用于派生最多的类,则将虚拟基类按照它们在基类声明的深度优先从左到右遍历时出现的顺序进行初始化(从左到右是指外观在基本说明符列表中)

2)然后,直接基类按从左到右的顺序初始化,因为它们出现在该类的基类说明符列表中

3)然后,按类定义中的声明顺序初始化非静态数据成员

4)最后,执行构造函数的主体

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章