【C++筆記】函式(筆記)
阿新 • • 發佈:2019-01-05
在標頭檔案中進行函式宣告
建議變數和函式應該在標頭檔案中宣告,在原始檔中定義。
使用引用避免拷貝
如果函式無須改變引用形參的值,最好將其宣告為常量引用。
// 比較兩個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(...);