如何使用初始化列表选择要使用的构造函数?

时间:2010-08-08 19:23:16

标签: c++ initialization

我刚刚问了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 */ }

我认为应该避免所有的任务,那么如何为这两个构造函数编写初始化列表呢?

4 个答案:

答案 0 :(得分:3)

我不太确定我会效仿。通过为xy(以及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) { }
}    

也许?