[英]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.