我刚刚问了this问题和使用初始化列表提到的好答案。所以我在很多不同的地方查了一下。人们常说,可以使用初始化列表来选择要使用的构造函数。
class First
{private:
int a, b, c;
public:
First(int x);
First(int x, int y);
}
First::First(int x, int y, int z = 0)
{ /* this is a constructor that will take two or three int arguements. */ }
First::First(int x, int y = 0, int z = 0)
{ /* and this will be called if one arguement is given */ }
我认为应该避免所有的任务,那么如何为这两个构造函数编写初始化列表呢?
答案 0 :(得分:3)
我不太确定我会效仿。通过为x
和y
(以及z
)提供参数,两个构造函数都可以调用,从而导致歧义。< / p>
我认为您正在寻找的是:
class First
{
public:
First(int x);
First(int x, int y, int z = 0);
};
// invoked as First f(1);
First::First(int x) :
a(x), b(0), c(0)
{}
// invoked as First f(1, 2); or First f(1, 2, 3);
First::First(int x, int y, int z) :
a(x), b(y), c(z)
{}
答案 1 :(得分:1)
Ctor初始化列表不是为了选择选择哪个ctor版本。
答案 2 :(得分:1)
这不是事情的运作方式。如果要使用默认参数,只使用一个constructof,使用默认参数声明它,并定义它(不重新定义它们)。
class First
{
private:
int a, b, c;
public:
First(int x, int y = 0, int z = 0);
};
First::First(int x, int y, int z)
{ /*...*/ }
考虑到您的问题,我不确定您知道初始化列表是什么......
答案 3 :(得分:1)
我认为你的意思是:
class First
{
private:
int a, b, c;
public:
First(int x);
First(int x, int y);
}
class Second
{
private:
Second(int x) : First(x) { }
Second(int x, int y) : First(x, y) { }
}
也许?