2013-08-20 191 views
3
// Case A 
class Point { 
private: 
    int x; 
    int y; 
public: 
    Point(int i = 0, int j = 0); // Constructor 
}; 

Point::Point(int i, int j) { 
    x = i; 
    y = j; 
    cout << "Constructor called"; 
} 

// Case B: 
class Point { 
private: 
    int x; 
    int y; 
public: 
    Point(int i, int j); // Constructor 
}; 

Point::Point(int i = 0, int j = 0) { 
    x = i; 
    y = j; 
    cout << "Constructor called"; 
} 

問題>案例A和案例B在VS2010中都沒有問題編譯。C++函數默認參數的位置

原文我只假設案例A的作品,因爲我記得默認參數應該在聲明函數的地方引入,而不是定義的位置。有人能糾正我嗎?

謝謝

+0

看到這個:http://stackoverflow.com/q/4989483/811335 –

+1

這是一個問題的從幾重複幾天前,原來C++標準有一個缺陷,使得這個代碼在技術上是合法的,但是卻給實現帶來了不必要的負擔。我會看看我能否找到它。 –

+0

[默認參數,gcc vs clang]可能的重複(http://stackoverflow.com/questions/18313509/default-argument-gcc-vs-clang) –

回答

0

如果你把默認參數到方法的定義,那麼只有那些誰看的定義將能夠使用默認參數。唯一的問題是,如果你嘗試這樣的事情:

public: 
    Point(int i = 0, int j = 0); 

(...) 

Point::Point(int i = 0, int j = 0) { ... } 

然後,你會得到一個生成時錯誤。

//編輯:但我很好奇馬克乙會發現你的問題下的評論中提到的。

// EDIT2:而且顯然也鐺編譯器不喜歡案例B.

+0

默認參數的目標之一是記錄默認值是什麼。因此,將它放在頭文件(聲明)中比將它放在實現中更有用(例如,如果創建了靜態庫,則可能不會看到它)。 該標準支持這兩種標準,但我強烈建議不要將其置於實施中。 –

+1

是的,我的意思是 - 可以做到這一點,但如果你真的做到了,你會很愚蠢。 –