2014-04-30 141 views
1

我想將std :: string作爲默認參數傳遞給函數。std :: string,字符串val和字符串之間的區別val =「」

我試圖像如下

void string_fun(int i, string val = "", int j = 10) 
// void string_fun(int i, string val, int j = 10) // <-- error since no default value 
{ 
    cout << "values " << endl; 
    cout << "i: " << i << endl; 
    cout << "val: " << val << endl; 
    cout << "j: " << j << endl; 
} 

void ret_fun() 
{ 
    string fun; 
    cout << "values " << endl; 
    cout << "fun: " << fun << endl; 
} 

int main() 
{ 
    string_fun(3); 
    ret_fun(); 
    return 0; 
} 

聽說字符串的默認構造函數將初始化字符串,如果這是正確的會是怎樣的該值?看到這裏,如果我只使用string val作爲函數的參數,我會得到編譯錯誤。但是,當我打印字符串valfun我得到相同的輸出。我的問題是什麼使兩個字符串的值不同,因爲string val = ""也創建一個空白字符串。

+1

考慮使用'string val = {}'而不是'string val =「」'。前者使用默認構造函數,而後者使用隱式構造函數從'const char *'創建一個字符串。前者可能更有效率。特別是,它是用_noexcept_聲明的。 – nosid

回答

3

您正在查看功能的參數列表,因此規則有所不同。 std::string有一個默認的構造函數並不重要。

問題是,參數列表的語言規則確保您允許或不允許呼叫者從呼叫中省略參數。當給定默認值時,調用者可以省略該參數,而使用默認值。如果沒有默認值,呼叫方必須提供一個適當的參數

如果你離開了第二個參數的默認值,您的通話

string_fun(3); 

不能編譯,因爲它至少需要兩個參數。你甚至可以在調用中使用默認的構造函數:

string_fun(3, string()); 
相關問題