更改构造函数中的初始化顺序

时间:2013-01-28 14:39:58

标签: c++ oop c++11 constructor initialization

 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 个答案:

答案 0 :(得分:5)

您无法更改初始化的顺序,该顺序始终由您班级中成员的声明顺序定义。这是必要的,因为破坏的顺序必须是构造顺序的反向,并且如果您更改了构造的顺序,编译器将被迫跟踪您已初始化您的成员的顺序,以便生成适当的销毁序列。

所以我的建议是:

  1. 忍受它,和;
  2. 不要依赖于成员变量的构造顺序。
  3. 要实现第2点),您可以为成员提供默认构造函数以进行默认初始化,然后在构造函数的 body 中按照您想要的顺序正确初始化您的成员(换句话说) ,将构造与逻辑初始化分离。)

答案 1 :(得分:3)

初始化的顺序由成员变量的声明顺序决定。因此,如果您希望在b之前初始化a,则必须先声明它。

class a
{
  public:
   a() : b(5), a1(10) {}
  private:
   int b;
  public:
   int a1;
};

答案 2 :(得分: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;
 }
无论如何,任何理智的编译器都会优化它,因此开销很小。

答案 3 :(得分:1)

b对象设为私有,在a1之前声明它,并创建一个访问函数来访问b的内容。 [如果有必要,让它返回对b对象的引用,这样调用代码就可以修改它 - 尽管将类的内部暴露给调用代码是非常糟糕的设计,无论是通过公共代码声明或通过返回引用]