支持或相等的初始化与构造函数委派

时间:2014-10-07 15:45:37

标签: c++ c++11 constructor

也许我的头衔可能转化为“苹果与橘子”,但我不太确定,所以我希望SO社区帮助理解一些最佳实践。

假设我有两个例子。

支持或平等初始化

class foo
{
public:
  foo() {}
  foo(int a) : m_a(a) {}
  foo(int a, int b) : m_a(a), m_b(b) {}
  foo(int a, int b, int c) : m_a(a), m_b(b), m_c(c) {}

private:
  int m_a = 1;
  int m_b = 2;
  int m_c = 3;
};

构造函数委派

class foo
{
public:
  foo() : m_a(1), m_b(2), m_c(3) {}
  foo(int a) : foo() { m_a = a; }
  foo(int a, int b) : foo() { m_a = a; m_b = b; }
  foo(int a, int b, int c) : foo() { m_a = a; m_b = b; m_c = c; }

private:
  int m_a;
  int m_b;
  int m_c;
};

我觉得第一个更好,因为它不会导致变量的双重初始化。在第二个例子中,foo构造函数的最后一次重载是最糟糕的,因为每个成员变量都初始化了两次。

这是首选方法?假设前者是首选,委托构造函数何时有用?

2 个答案:

答案 0 :(得分:2)

您希望从占用较少参数的构造函数委托给占用最多的构造函数,为额外参数提供默认值:

foo( int a, int b, int c ) : m_a(a), m_b(b), m_c(c) {}
foo( int a, int b ) : foo( a, b, 3 ) {}
foo( int a ) : foo( a, 2, 3 ) {}
foo() : foo( 1, 2, 3 ) {}

答案 1 :(得分:2)

就像clcto所指出的那样,你应该以不同的方式进行授权。

实际上我们可以使用默认的参数值做得更好(使用您的示例!!! ):

class foo
{
public:
  // no longer need all your other constructors
  foo(int a=1, int b=2, int c=3) : m_a(a),m_b(b),m_c(c){}

private:
  int m_a;
  int m_b;
  int m_c;
};

您的实际代码可能有所不同;即,您希望有时初始化b而不是ac,因此您可以改为使用已发布的其他答案之一。