C++ Prime:函數


局部靜態對象:  

  某些時候,有必要令局部變量的生命周期貫穿函數調用及之后的時間。可以將局部變量定義成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對象
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM