天天看點

c++ 函數的預設參數

/** 
 * @file test.cpp
 * @author chenjiashou([email protected])
 * @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;
    }
} ;