1

我有以下代码,它利用了初始化列表中的逗号运算符。

#include <iostream>

using namespace std;

class Base
{
    protected:
        int b;
    public:
        Base(int a):b(a){}
};

class A:public Base
{
    private:
        const int i;
        const int j;
        void inc(int & a, int & b) {a++; b++;}
    public:
        A(int a, int b):i((inc(a,b),a)),j(b),Base(a+b){}
        void print(){cout<<i<<" "<<j<<" "<<b<<endl;}
};

int main()
{
    A a(6,7);
    a.print();
    return 0;
}

我期望结果是:

7, 8, 15

但结果是:

7, 8, 13

似乎“a”和“b”在用于构造基类时没有递增。不知道为什么...

4

1 回答 1

7

成员初始化列表中的项目顺序控制成员初始化的顺序。首先初始化基类,然后按照定义1的顺序初始化派生类的成员。

由于基类首先被初始化,所以在调用之前Base(a+b)执行,所以它会看到和之前的值,它们已经被递增了。incab


  1. c++11,第 12.6.2/10 节:

在非委托构造函数中,初始化按以下顺序进行:

  • 首先,并且仅对于最派生类(1.8)的构造函数,虚拟基类按照它们出现在基类的有向无环图的深度优先从左到右遍历的顺序进行初始化,其中“左- to-right”是派生类base-specifier-list中基类的出现顺序。
  • 然后,直接基类按照它们出现在 base-specifier-list 中的声明顺序进行初始化(无论 mem-initializers 的顺序如何)。
  • 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序)。
  • 最后,执行构造函数主体的复合语句。
于 2013-10-16T04:34:42.727 回答