1
 class a
 {
 public:
 a() : b(5), a1(10) //will firstly initialize a1 then b, so order here doesn't matter
 int a1;
 private:
 int b;
 }

问题是如何更改顺序(在 a1 之前初始化 b)?我必须有高于私人的公共成员,这样解决方案对我来说不合适。当然在这里我使用整数,问题更复杂,但这只是一个例子,说明我的问题是什么。

4

4 回答 4

5

您不能更改初始化顺序,初始化顺序始终由类中成员的声明顺序定义。这是必要的,因为破坏顺序必须与构造顺序相反,如果您更改了构造顺序,编译器将被迫跟踪您初始化成员的顺序以生成正确的破坏序列。

所以我的建议是:

  1. 忍受它,并且;
  2. 不要依赖于成员变量的构造顺序。

为了实现第 2 点),您可以为您的成员提供默认构造函数以进行默认初始化,然后按照您在构造函数主体内的顺序正确初始化您的成员(换句话说,将构造与逻辑初始化解耦)。

于 2013-01-28T14:42:01.673 回答
3

初始化的顺序由成员变量的声明顺序决定。所以如果你想b在之前被初始化a,你必须在之前声明它。

class a
{
  public:
   a() : b(5), a1(10) {}
  private:
   int b;
  public:
   int a1;
};
于 2013-01-28T14:41:11.687 回答
2

如果我理解你是正确的,你有某种风格指南说公共成员应该在私人之前。

在这种情况下,我建议您将所有成员变量声明为私有并为它们创建访问器函数。这样你就可以绕过它。

class a
 {
 public:
   a() : _a1(5), _b(10) 
   int a1() const { return _a1; }
   void a1(int value) { _a1 = value; }
   int b() const { return _b; }
   void b(int value) { _b = value; }

 private:
   int _a1;
   int _b;
 }

无论如何,任何理智的编译器都会对其进行优化,因此开销将最小化。

于 2013-01-28T14:52:47.123 回答
1

将您的b对象设为私有,在之前声明它a1,并创建一个访问函数来访问b. [如有必要,使其返回对b对象的引用,以便调用代码可以修改它——尽管将类的内部暴露给调用代码显然是很糟糕的设计,无论是通过公共声明还是通过返回参考]

于 2013-01-28T14:50:30.743 回答