1. 程式人生 > >【C++筆記】函式(筆記)

【C++筆記】函式(筆記)

在標頭檔案中進行函式宣告

建議變數和函式應該在標頭檔案中宣告,在原始檔中定義。

使用引用避免拷貝

如果函式無須改變引用形參的值,最好將其宣告為常量引用。

// 比較兩個string物件的長度
bool isShorter(const string &s1,const string &s2)
{
    return s1.size()<s2.size();
}
儘量使用常量引用
bool is_empty(const string& s)      { return s.empty(); }
表示陣列大小的形參
void print
(const int ia[],size_t size) // 等價於const int* ia { for(size_t i=0; i!=size; ++i) cout << ia[i] <<endl; }
陣列引用形參
// 正確:形參是陣列的引用,維度是型別的一部分
void print(int (&arr)[10])
{
    for(auto elem:arr)
        cout << elem << endl;
}

f(int &arr[10]);                // 將arr宣告成了引用的陣列
f(int (&arr)[10]); // arr是具有10個整數的整型陣列的引用 int *matrix[10]; // 10個指標構成的陣列 int (*matrix)[10]; // 指向含有10個整數的陣列的指標
initializer_list

如果函式的實引數量未知但是全部實參的型別都相同,可以使用initializer_list型別的形參。

這裡寫圖片描述

和vector一樣,initializer_list也是一種模板型別,定義initializer_list物件時,必須說明列表中所含元素的型別。

initializer_list<string
> ls; initializer_list<int> it;

和vector不一樣的是,initializer_list物件中的元素永遠是常量值,無法改變initializer_list物件中元素的值。

如果想向initializer_list形參中傳遞一個值的序列,則必須把序列放在一對花括號內。

void error_msg(ErrCode e,initializer_list<string> il)
{
    cout << e.msg() << ":";
    for(const auto &elem:il)
        cout << elem << " ";
    cout << endl;   
}

// expected和actual是string物件
if(expected != actual)
    error_msg(ErrCode(42),{"functionX",expected,actual});
else
    error_msg(ErrCode(0),{"functionX","okay"});
省略符形參

省略符形參是為了便於C++程式訪問某些特殊的C程式碼而設定的,這些程式碼使用了名為varargs的C標準庫功能。省略符形參應該僅僅用於C和C++通用的型別。特別應該注意的是,大多數類型別的物件在傳遞給省略符形參時都無法正確拷貝。

省略符形參只能出現在形參列表的最後一個位置。

void foo(parm_list,...);
void foo(...);