2013-04-08 40 views
11

我還是比較新的C++,我似乎無法弄清以下兩種編碼函數的區別,可能需要一個參數或者兩個或三個或更多。總之,這裏是我的一點重載方法或使用默認值? C++

函數重載:

int aClass::doSomething(int required) 
{ 
    //DO SOMETHING 
} 

int aClass::doSomething(int required, int optional) 
{ 
    //DO SOMETHING 
} 

這是怎麼不同來,默認值:

int aClass::doSomething(int required, int optional = 0) 
{ 
    //DO SOMETHING 
} 

我知道在不同的情況下,一個可能比另一個但什麼樣的更適合我應該在選擇這些選項時注意什麼?

回答

6

首先,你說的是超載,而不是壓倒一切。重寫是在派生類中爲virtual函數完成的。重載是指具有不同簽名的相同函數名稱。

區別是合乎邏輯的 - 在第一種情況下(2個版本),這兩個函數可以表現完全不同,而第二種情況將具有或多或少相同的邏輯。這真的取決於你。

2

如果您提供多個constructor,您正在使用超載功能。在這種情況下的優點是,您可以在傳遞參數的每個constructor上做出不同的反應。如果這是重要的使用超載。
如果您可以爲參數提供合適的default值,並且這些值不會影響代碼的正確運行,請使用默認參數。

請參閱here瞭解SO上的線程。

2

編譯器不關心你使用哪些。想象一下,你把它寫成兩個構造函數,並且它們結束了大約20行。進一步想象線19是相同的,並且不同的線在一個版本和

foo = optional; 

在其他讀

foo = 0; 

。在這種情況下,使用可選參數使您的代碼更具可讀性和可理解性。在另一種沒有可選參數的語言中,您可以通過讓單參數版本調用兩個參數版本並將其作爲第二個參數傳遞給零來實現。

現在想象一個不同的構造函數或函數對,它們的長度大約相差20行,但完全不同。例如,第二個參數是一個ID,如果提供了它,則在數據庫中查找填充內容,如果不是,則將值設置爲nullptr,0等等。你可以有一個默認值(-1是受歡迎的這個),但隨後的函數體將是充滿

if (ID == -1) 
{ 
    foo = 0; 
} 
else 
{ 
    foo = DbLookup(ID); 
} 

這可能是難以閱讀,會使單一功能比兩個長了不少單獨的功能。我已經看到了一個巨大的函數if,它將整個事物分解爲兩個獨立的塊,沒有共同的代碼,並且我已經看到相同的條件在計算過程中測試了4次或5次。兩者都很難閱讀。

這就是關於C++的事情。有很多方法可以完成大部分事情。但是這些不同的方式有不同的用途,一旦你「獲得」細微的差異,你就會寫出更好的代碼。在這種情況下,「更好」意味着更短,更快(所有這些都需要花費執行時間),並且更具表現力 - 讀者可以快速理解你的意圖。

11

有幾個技術上的原因更喜歡重載默認參數,它們是很好的Default Arguments section奠定了在谷歌的C++ Style Guide:因爲函數簽名

函數指針正在混淆視聽的默認參數存在, 通常與呼叫簽名不匹配。 將缺省參數添加到現有函數會更改其類型 ,這可能會導致代碼佔用地址的問題。增加功能 重載避免了這些問題。

和:

默認參數可能會導致笨重的代碼,因爲他們是 複製在每個調用點 - 而不是重載函數, 其中「默認」只出現在功能定義。

從積極的一面,它說:

通常你有一個使用默認值的功能,但偶爾 要覆蓋缺省值。默認參數允許以簡單的方式來執行此操作,而無需爲罕見的異常定義許多功能。

因此,您的選擇將取決於負面問題對您的應用程序有多相關。

+0

兩個downvotes和沒有評論? – 2017-12-16 10:26:34