/** * @file test.cpp * @author chenjiashou(chenjiashou@baidu.com) * @date 2017/08/20 15:54:27 * @version $Revision$ * @brief * **/ #include <iostream> int print(int a = 1, int b = 2); int main() { print(); print(-1); return 0; } //int print(int a = 1, int b = 2) {// 編譯錯 int print(int a, int b) { std::cout << a << "," << b << std::endl; }
結果:
1,2 -1,2
首先看上述的代碼,print函數是帶有默認參數的。
所以調用print(), print(-1)都可以准確的輸出。
這種默認參數的情況會帶來有些便利。(比如初始化一個商品對象,在99%的情況在都是正常的,那么這個商品是否正常的標記就可以默認為1,特殊的1%情況,再加上)
但是有以下三個要注意的情況。
1. 默認參數只能放在函數聲明處或者定義處,能放在聲明處就放在聲明處 。
上述代碼把那行注釋打開,默認參數在聲明和定義處都有了,那么就會有編譯錯誤。(兩次默認賦值是不被允許的。)
a. 大部分情況,別人調用你的代碼只能看到函數聲明,如果你寫在定義處,別人根本不知道你的默認參數是什么。
b.如果你是在定義處寫的默認參數,那么你在使用該函數前就需要把函數定義放在前面。不然編譯階段通過無默認參數的函數聲明無法確定這個函數是帶默認參數的。
所以,默認參數寫在聲明處啊。^ ^
2.如果某個參數是默認參數,那么它后面的參數必須都是默認參數
因為非默認參數的參數必須要給出具體值,而調用函數傳遞參數的時候是從左到右的,所以非默認參數前面的都必須要傳值進來。
那么默認參數后面的當然也得都為默認參數。
3.不要重載一個帶默認參數的函數
看下這個函數:
class Test { public: int func(int a) { return a; } int func(int a, int b = 1) { return a + b; } } ;
你調用func(1)的時候,誰知道你想調用哪一個。