【问题标题】:C++ Member Initializer Lists Problem: Declaration Order on Private Member VariablesC++ 成员初始化器列表问题:私有成员变量的声明顺序
【发布时间】:2021-07-19 17:39:17
【问题描述】:

这是我在 Stack Overflow 上发布的第一个问题,希望有人能解释一下。 所以基本上这两个类除了私有成员变量的顺序是相同的。输出是10 20 10 0 我不明白为什么声明的顺序会影响输出。

#include <iostream>
using namespace std;

class MyClass{
public:
    MyClass(int value): b(value), a(b * 2){
        cout << b << " " << a << " ";
    }
private:
    int b;
    int a;
};

class YourClass{
public:
    YourClass(int value): d(value), c(d * 2){
        cout << d << " " << c << " ";
    }
private:
    int c;
    int d;
};

int main(){
    MyClass obj(10);
    YourClass OBJ(10);
}

【问题讨论】:

  • 因为order matters 你应该得到一个警告:coliru.stacked-crooked.com/a/2dc06f1a6801bb90
  • 类数据成员按照它们在类中的声明顺序进行初始化,而不是按照您在构造函数初始化列表中指定的顺序。对于YourClass,c会在d初始化之前被初始化,但是它使用d,所以在初始化c时基本上你有未定义的行为。
  • 我不明白为什么声明的顺序会影响输出。这仅仅是因为 C++ 标准是这样指定的:eel.is/c++draft/class.base.init#13.3
  • 谢谢,我明白了。

标签: c++ class private member initializer


【解决方案1】:

类成员按照它们的声明顺序进行初始化。

Initialization Order of Class Data Members

#include <iostream>

class MyClass{
public:
    MyClass(int value): b(value++), a(value++){
        std::cout << b << " " << a << " " << std::endl;
    }
private:
    int b;
    int a;
};

class YourClass{
public:
    YourClass(int value): b(value++), a(value++){
        std::cout << b << " " << a << " " << std::endl;
    }
private:
    int a;
    int b;

};

int main(){
    MyClass obj(10);
    YourClass OBJ(10);
}

输出:

10 11
11 10

【讨论】:

  • 谢谢! value++ 真的很有帮助
猜你喜欢
  • 2023-03-24
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多