2011-05-13 118 views
4

我已經遇到了一些C++代碼看起來像這樣(簡化爲這個職位):在C++函數頭初始化變量

(這裏是位於someCode.hpp函數原型)

void someFunction(const double & a, double & b, const double c = 0, const double * d = 0); 

(這裏的函數體的第一行位於someCode.cpp#includesomeCode.hpp

void someFunction(const double & a, double & b, const double c, const double * d); 

我可以合法地調用someFunction使用:

someFunction(*ptr1, *ptr2); 

和/或

someFunction(*ptr1, *ptr2, val1, &val2); 

其中變量ptr1ptr2val,和val2已經適當定義和val1val2不等於零?爲什麼或者爲什麼不?

如果它是合法的,這個語法首選與重載函數來說明可選參數?

回答

5

是的,這是合法的,這叫做default arguments。我會說,由於涉及較少的代碼,所以最好是重載。

關於您的評論對const,這並不適用於默認值本身,它適用於爭論。如果你有const char* fruit = "apple"類型的參數,這並不意味着它必須用字符指針,其值是一樣的"apple"字符串字面量的地址被調用(這是很好的,因爲這將是很難保證)。它只是意味着它必須用一個指向常量字符的指針來調用,並且告訴你被調用的函數不需要寫入該內存,它只能從中讀取。

+0

感謝您的回覆並回復鏈接。我不知道這些被稱爲什麼。爲什麼默認參數是'const'是合法的?它們看起來像是'const'意味着它們不能被改變。 – Evan 2011-05-13 09:22:47

+1

@Evan:'const'限定符適用於函數參數,而不是所提供的默認值。默認值的分配發生在函數調用時,就像提供的參數的賦值一樣。如果事情按照你所想的方式工作,那麼用'const'參數多次調用一個函數是非法的。 – Omnifarious 2011-05-13 09:41:26

1

是的,參數是可選的,當你不通過它們時,將使用給定的默認值。

它使用默認參數值而不是重載有一些優點和缺點。在接口和實現部分中輸入的優點較少。但缺點是默認值是接口的一部分及其所有後果。然後,當您更改默認值時,例如在使用重載時需要重新編譯大量代碼而不是單個文件。

我個人更傾向於默認參數。

0

我可以合法地調用someFunction使用:

someFunction(* PTR1,PTR2 *);

絕對!是的,該函數接受的其他兩個變量將具有您在頭文件中爲這兩個參數設置爲零的默認值。

但是,如果你提供了第3和第4個函數參數,那麼這些值被視爲而不是默認值。

1

我想擴大一點,是否默認參數優於重載。

通常他們是出於所有其他答案中給出的原因,最顯着的是較少的樣板代碼。

也有使在某些情況下重載一個更好的選擇正當的理由:

默認值是接口的一部分,變化可能會破壞客戶(@Juraj已經提到) 此外重載使其更容易添加額外的(組合)參數,而不會破壞(二進制)接口。

重載在編譯時解決,這可以使編譯器更好地優化(特別是內聯)可能性。例如如果你有這樣的事情:

void foo(Something* param = 0) { 
    if (param == 0) { 
     simpleAlgorithm(); 
    } else { 
     complexAlgorithm(param); 
    } 
} 

它可能會更好使用重載。