也许我的头衔可能转化为“苹果与橘子”,但我不太确定,所以我希望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构造函数的最后一次重载是最糟糕的,因为每个成员变量都初始化了两次。
这是首选方法?假设前者是首选,委托构造函数何时有用?
答案 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
而不是a
或c
,因此您可以改为使用已发布的其他答案之一。