我正在为x和y笛卡尔坐标系创建一个pair1类。 x和y是双打。我需要有3个构造函数。
pair1::pair1(double)
和pair1::pair1(double)
无法重载。我的课程:
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; }
};
答案 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);