类构造函数参数C ++

时间:2011-06-30 01:08:23

标签: c++ class constructor arguments

我正在为x和y笛卡尔坐标系创建一个pair1类。 x和y是双打。我需要有3个构造函数。

  1. 没有参数,默认x和y为零。
  2. 一个争论分配x,默认y为零。
  3. 一个arugeument默认x为零并指定y。我不确定我是否正确设置了这门课程。我收到了以下错误:pair1::pair1(double)pair1::pair1(double)无法重载。
  4. 我的课程:

    class pair1
    {
    private:
        double x;
        double y;
    
    public:
        pair1(){ x = 0.0, y = 0.0; }    
        pair1( double a ){ x = a; y =0.0; }
        pair1(double b){ x = 0.0;  y = b; }
    };
    

4 个答案:

答案 0 :(得分:5)

  

1)没有参数,默认为x和y   零。

这很容易

  

2)一个争论分配x和   将y默认为零。

     3)一个arugeument   将x默认为零并指定y。

这是一个问题。你怎么知道,当你只有一个参数时,两者中哪一个被称为?这就是你得到编译错误的原因。

相反 - 使用默认构造函数(没有参数的构造函数),完整构造函数(两者都有),如果需要,SetX()SetY()分别设置X和Y,按功能名称区分。

class pair1
{
    private:
    double x;
    double y;

    public:
    pair1( double a=0.0, double b=0.0 ){ x = a; y =b; };
                     // default value 0.0 allows to only
                     // set x, and leave y to be the default,
                     // or leave them both default.
    void SetX(double a) { x=a;};
    void SetY(double b) { y=b;};
};

答案 1 :(得分:2)

问题是编译器无法区分

pair1(double a)

pair1(double b)

实际上,除参数名称外,它们是相同的。例如:

pair1 myPair1(123.456); // Which constructor should be called?

这称为模糊重载。

答案 2 :(得分:1)

pair1( double a ){ x = a; y =0.0; }
pair1(double b){ x = 0.0;  y = b; }

这些是完全相同的构造函数。不同的参数名称没有任何区别。对于重载而言,重要的是 type(s) number 类型及其排序。< / p>

答案 3 :(得分:0)

我不确定除了(0,0)情况之外的默认参数是否有用,但是这样的东西可以起作用:

struct X
{
    double value;
    explicit X(double v) : value(v) {}
};

struct Y
{
    double value;
    explicit Y(double v) : value(v) {}
};

class pair1
{
    private:
        double x;
        double y;

    public:
        pair1() : x(0.0), y(0.0) {}
        explicit pair1(X a) : x(a.value), y(0.0) {}
        explicit pair1(Y b) : x(0.0), y(b.value) {}
        pair1(X a, Y b) : x(a.value), y(b.value) {}  // For completeness
        pair1(Y b, X a) : x(a.value), y(b.value) {}  // For super-completeness
        pair1(double a, double b) : x(a), y(b) {}
};

使用:

pair1 aPair(X(2.0));                 // default y
pair1 anotherPair(Y(4.875));         // default x
pair1 aThirdPair(X(1.0), Y(1.0));
pair1 aForthPair(Y(100.0), X(1.0));  // keyword arguments ;-)
pair1 quintus(23.0, 45.6);