2013-06-22 64 views
1

我想知道哪些代碼更好地工作在一般條件下,如果有他們之間的任何相關差異...函數重載VS函數變量初始化

第一種情況

float x; 

float foo (float A, float B, float x = x) 
{ 
    // do stuff with A, B, x ... 
} 

第二種情況

float x; 

float foo (float A, float B, float x) 
{ 
    // do stuff with A, B, x ... 
} 
float foo (float A, float B) 
{ 
    // do stuff with A, B, x ... 
} 
+0

定義「更好」 –

+0

如果你正在做同樣的'東西',爲什麼要寫它兩次,並使用全球? – manasij7479

回答

1

違約論點是一種祝福和詛咒;他們讓你減少構造函數的重複 - 這本身就是導致錯誤的原因。 C++ 11在一定程度上解決了這個問題。

不幸的是,它們也意味着它在重構代碼時往往需要更多的努力,特別是當你積累越來越多的同一指紋變體時。

void someFunc(int count, void* ptr=nullptr, int count=1); 

成爲

void someFunc(int count, bool hasPtr=true, void* ptr=nullptr, int count=1); 

將會引起人們實際上已經填寫了所有3個參數的問題。

someFunc(10, p, 0) 

是要匹配成功

someFunc(/*count=*/10, /*hasPtr=*/true, /*ptr*/=NULL, /*count*/=1) 

所以,你將不得不做的額外工作的量要記得解決這個問題。我的經驗是,其他程序員經常遇到這種變化,隨之出現崩潰/行爲錯誤。