[英]Class Constructor arguments C++
我正在为 ax 和 y 笛卡尔坐标系创建一对 class。 x 和 y 是双精度数。 我需要有 3 个构造函数。
pair1::pair1(double)
和pair1::pair1(double)
不能重载。我的 class:
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; }
};
1) 没有 arguments,默认 x 和 y 为零。
这很容易
2) 一个论点指定 x 并将 y 默认为零。
3)一个arugeument默认x为零并分配y。
那是个问题。 当您只有一个参数时,您怎么知道要调用这两个参数中的哪一个? 这就是你得到编译错误的原因。
取而代之 - 使用默认构造函数(没有参数的那个)、完整的构造函数(两个都有),如果需要,使用SetX()
和SetY()
分别设置 X 和 Y,并通过名称来区分function。
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;};
};
问题是编译器没有办法区分
pair1(double a)
和
pair1(double b)
实际上,除了参数的名称之外,它们是相同的。 例如:
pair1 myPair1(123.456); // Which constructor should be called?
这称为模糊重载。
pair1( double a ){ x = a; y =0.0; }
pair1(double b){ x = 0.0; y = b; }
这些是完全相同的构造函数。 不同的参数名称没有任何区别。 重载重要的是类型和类型的数量,以及它们的顺序。
我不确定除了 (0,0) 情况外,默认 arguments 是否有任何用途,但这样的事情是否可行:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.