Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 缺少第一个构造函数参数_C++_Parameters_Constructor - Fatal编程技术网

C++ 缺少第一个构造函数参数

C++ 缺少第一个构造函数参数,c++,parameters,constructor,C++,Parameters,Constructor,我有一个具有以下默认构造函数的类对象: Point( double x = 0, double y = 0 ); 如果我创建: Point myPoint(); Point mySecondPoint(14); 我将通过(0,0)得到一个分数。如果我创建: Point myPoint(); Point mySecondPoint(14); 我将通过(14,0)得到一个分数 但为什么是: Point myThirdPoint(, 10) //invalid 没有给我一分(0,10)

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

Point( double x = 0, double y = 0 );
如果我创建:

Point myPoint();
Point mySecondPoint(14);
我将通过
(0,0)
得到一个分数。如果我创建:

Point myPoint();
Point mySecondPoint(14);
我将通过
(14,0)
得到一个分数

但为什么是:

Point myThirdPoint(, 10)   //invalid

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

< p>,因为C++有一些严格的语法规则。从这个角度来看,你的例子根本不正确。声明默认参数时,请遵循以下规则:如果您想更改默认值,则默认的参数是最不常用的默认参数,因为C++命令在指定要更改默认值之前的所有参数。
C++
要求在提供的参数之前提供所有默认参数

8.3.6默认参数[dcl.fct.Default]

如果在参数声明中指定了初始值设定项子句,则此 初始值设定项子句用作默认参数。默认参数 将用于缺少尾随参数的调用

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

  • 默认值3必须是最后3个参数
  • 可以使用前2个参数、前3个参数、前4个参数或全部5个参数调用函数

  • 我应该如何编码第二个参数,但是 不是第一个

    在我看来,您的构造函数接口不是很好。在这种情况下,我只希望使用两个构造函数,默认值没有任何参数,一个有两个参数。如果只想给出一个参数,则必须自己指定另一个参数的默认值

    i、 e

    或者您应该使用一些函数来创建新点

    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;
    
    点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;
    }
    

    pointmypoint()
    不符合您的要求。您是否认为
    p2(X(1.0))
    p2(1.0,0.0)
    对读者更清晰,从而对代码的维护更清晰?@MohitJain I没有断言OP应该这样做,只是回答了这个问题。然而,有人可能会提出这样的论点,即在某些上下文中,这会使代码更容易,更不容易出错。例如,一个3D坐标(表示纬度、经度和高程)
    点(Lon(28)、Lat(-82)、Elev(100))
    ,可以说它比
    点(28,-82100)
    (即,是约定的Lat/Lon或Lon/Lat)更清晰。