局部靜態對象:
某些時候,有必要令局部變量的生命周期貫穿函數調用及之后的時間。可以將局部變量定義成static類型從而獲得這樣的對象。局部靜態對象在程序執行路徑第一次經過對象定義語句時初始化,並且直到程序終止才被銷毀,在此期間即使對象所在的函數結束執行也不會對它有影響。
size_t count_calls() { static size_t ctr = 0; return ++ctr; } int main() { for(size_t i = ; i != 10 ; i++ ) cout<< count_calls() <<endl; return 0; }
這段程序將輸出從1到10的數字。
傳引用參數:
示例:
// 該函數接受一個int對象的引用,然后將對象的值置為0 void Reset(int &i) // i是傳給Reset函數的對象的另一個名字 { i = 0; } // 調用這一版本的Reset函數時,可直接傳入對象而無須傳遞對象的地址: int j = 42; Reset(j); cout<<j<<endl; // 輸出j=0
使用引用避免拷貝:
拷貝大的類類型對象或者容器對象比較低效,甚至有的類型就不支持拷貝操作。當某種類型不支持拷貝操作時,函數只能通過引用形參訪問該類型的對象。
舉個例子,准備編寫一個函數比較兩個string對象的長度,因為string對象可能很長,應該盡量避免直接拷貝它們,這時使用引用形參是比較明智的選擇。
如果函數無須改變形參的值,最好將其聲明為常量引用。
使用引用形參返回額外信息:
一個函數只能返回一個值,然而有時函數需要同時返回多個值,引用形參為我們一次返回多個結果提供了有效的途徑。舉個例子,我們定義一個名為fnd_char的函數,它返回在string對象中某個指定字符第一次出現的位置,同時,也希望能返回該字符出現的總次數。為了使函數既能返回位置也能返回出現次數,一種是定義一個新的類型,還有一種就是傳入一個額外的引用實參,令其保存字符出現的次數。
含有可變形參的函數:
為了編寫能處理不同數量實參的函數,C++11新標准提供了兩種主要的方法:如果所有的參數類型相同,可以傳遞一個名為initializer_list的標准庫類型;如果實參的類型不同,可以編寫一種特殊的函數,此處暫不介紹。
C++還有一種特殊的形參類型,即省略符,可以用來傳遞可變輸了的實參,不過這種功能一般只用於與C函數交互的接口程序。
initializer_list形參:
initializer_list是一種標准庫類型,用來表示某種特定類型的值的數組。示例:
void Test(initializer_list<string> il) { for(auto beg = il.begin(); beg!= il.end(); ++beg) cout<<*beg<<endl; }
引用返回左值:
char &get_val(string &str, string::size_type ix) { return str[ix]; } int main() { string s("a value"); cout<<s<<endl; // 輸出a value get_val(s,0) = A; // 將s[0]的值改為A cout<<s<<endl; // 輸出A value return 0; }
返回值是引用,因此調用是個左值,和其他左值一樣也能出現在賦值運算符的左側。
如果返回的類型是常量引用,不能給調用的結果賦值:
shortString("hi","bye") = "X"; // 錯誤,返回值是常量
列表初始化返回值:
vector<string> process() { if() return {}; // 返回空的vector對象 else return {"okey","buy"}; // 返回列表初始化的vector對象 }