2015-04-16 83 views
1

我有以下默認構造函數的類對象:缺少第一個構造函數參數

Point(double x = 0, double y = 0); 

如果我創建:

Point myPoint(); 

我會得到一個點與(0, 0)。如果我創建:

Point mySecondPoint(14); 

我將得到一個點(14, 0)

但爲什麼:

Point myThirdPoint(, 10) //invalid 

不給我的(0, 10)點。我應該如何編碼具有第二個參數的可能性,但不是第一個參數?

+0

'Point myPoint();'不做你聲稱的。 – chris

回答

0

點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; 
} 
+0

您是否認爲'p2(X(1.0))'比讀者的p2(1.0,0.0)更清晰,因此對於維護代碼? –

+0

@MohitJain我沒有斷言這是OP應該做的,只是回答這個問題。但是,有人可能會認爲,在某些情況下,這會使代碼更容易,更不容易出錯。例如,一個三維座標(表示緯度,經度和高程)'Point(Lon(28),Lat(-82),Elev(100))',可以認爲這比「點(28,-82 ,100)(即,是慣例經緯度還是經度/緯度/經度)。 –

0

因爲C++有一些嚴格的語法規則。從這個角度來看,你的例子根本不正確。在聲明默認參數時,請遵循以下規則:您希望頻繁更改的默認參數應該是最右邊的默認參數,因爲C++要求在您希望從默認值更改其值之前指定所有參數。

1

與其他一些語言不同,C++要求在提供的參數之前提供所有默認參數。

8.3.6默認參數 [dcl.fct.default]

如果在一個參數聲明中指定一個初始化子句此 初始化子句被用作默認參數。缺省參數 將用於呼叫尾隨參數丟失。

所以,如果一個函數有5個參數出其中3個默認:

  1. 默認值3必須是最後的3個參數
  2. 您可以致電與前2個參數的功能,前3個參數,第一個4個參數或全部5個參數。

我應該如何編碼具有第二個參數的可能性,但 不是第一?

在我的看法你的構造函數接口不是很好。在這種情況下,我寧願只有兩個構造函數,默認沒有任何參數,一個有兩個參數。如果你只想給出一個參數,你必須自己指定其他參數的默認值。

Point(); 
Point(double x, double y); 

還是應該使用一些功能,以創建一個新點

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; 
相關問題