缺少第一个构造函数参数

时间:2015-04-16 04:47:02

标签: c++ parameters constructor

我有一个带有以下默认构造函数的类对象:

Point( double x = 0, double y = 0 );

如果我创建:

Point myPoint();

我会得到(0, 0)的观点。如果我创建:

Point mySecondPoint(14);

我会得到(14, 0)的一点。

但为什么:

Point myThirdPoint(, 10)   //invalid

没有给我一点(0, 10)。我应该如何编写第二个参数的可能性,而不是第一个?

3 个答案:

答案 0 :(得分:1)

与其他一些语言不同,C++要求在提供的参数之前提供所有默认参数。

来自 8.3.6默认参数 [dcl.fct.default]

  

如果在参数声明中指定了initializer子句   initializer-clause用作默认参数。默认参数   将在缺少尾随参数的调用中使用。

因此,如果一个函数有5个参数,其中3个是默认参数:

  1. 默认值3必须是最后3个参数
  2. 您可以使用前2个参数,前3个参数,前4个参数或全部5个参数调用函数。

  3.   

    我应该如何编写第二个参数的可能性,但是   不是第一个?

    在我的视图中,构造函数接口不是很好。在这种情况下,我宁愿只有两个构造函数,默认没有任何参数,一个有两个参数。如果您只想提供一个参数,则必须自己指定其他参数的默认值。

    Point();
    Point(double x, double y);
    

    或者你应该使用一些函数来创建一个新的点

    Point CreateWithY(double y)
    {
      return Point(0.0, y);
    }
    

    并将其用作

    Point p = CreateWithY(42.0); // Creates (0.0, 42.0)
    

    不是答案的一部分,但是:

    Point myPoint();
    

    声明函数 myPoint,它不接受任何参数并返回Point类型的对象。您打算使用的可能是:

    Point myPoint;
    

答案 1 :(得分:0)

因为C ++有一些严格的语法规则。从这个角度来看,你的例子是不正确的。在声明默认参数时,请遵循以下规则:您最不希望更改频率的默认参数应该是最右边的默认参数,因为C ++要求在您希望从默认值更改其值之前指定所有参数。 / p>

答案 2 :(得分:0)

  

指向myThirdPoint(,10)//无效

正如其他人所说,C ++不支持这种语法。

  

我应该如何编写第二个参数的可能性,而不是第一个?

首先,你应该考虑这是否真的应该做 。我不知道是否有更优雅的方法来实现这一点,但你可以引入新的类型并依赖于重载。 警告,我并没有建议您实际上应该走这条路线而只是为了说明。

struct X
{
    X(double v = 0.0) : mValue(v) {}
    operator double() const { return mValue; }

private:
    double mValue;
};

struct Y
{
    Y(double v = 0.0) : mValue(v) {}
    operator double() const { return mValue; }

private:
    double mValue;
};

class Point
{
public:
    Point() : mX(0.0), mY(0.0) {}
    Point(X x) : mX(x), mY(0.0) {}
    Point(Y y) : mX(0.0), mY(y) {}
    Point(X x, Y y) : mX(x), mY(y) {}

private:
    double mX;
    double mY;
};

int main()
{
    Point p1;
    Point p2(X(1));
    Point p3(Y(2));
    Point p4(X(3), Y(4));

    return 0;
}