c++ 函式引數傳遞
阿新 • • 發佈:2018-12-25
指標形參
當函式使用指標作為形參時, 本質也是使用傳值引數, 只是傳遞的是變數的地址,所以可以通過指標修改它所指的物件的值, 但是在c++ 中推薦使用引用型別的形參替代指標。
傳引用引數
使用引用傳參可以避免拷貝操作, 提搞程式的效率。 尤其是拷貝大的類型別或者容器物件比較低效,或者有的類型別就不支援拷貝操作。引用形參也為我們一次返回多個結果提供了途徑。
const形參和實參
初始化過程中,會把頂層const,所以初始化時,形參的頂層const被忽略掉了。當形參有頂層const時,傳給它常量物件或者非常量物件都是可以的。
void func(const int i) {} // func可以讀取i的值,但是不能向i寫值, 這個const 有點多餘,寫入程式碼會很low
另外, 函式的引數儘量使用常量引用。
陣列形參
陣列有兩個特殊的性質:
- 不允許拷貝陣列
使用陣列時(通常)會將其轉換成指標(decltype中,陣列不會轉換為指標)
因為陣列不能拷貝,所以陣列不能進行值傳遞, 因為陣列會被轉換為指標,所以當我們為函式傳遞一個數組時,實際上傳遞的是指向陣列首元素的指標。 另外,只有當函式確實要改變元素值的時候,才把形參定義成指向非常量的指標。
含有可變形參的函式
initializer_list形參
如果函式的實引數量未知但是全部實參型別相同,我們可以使用initializer_list型別的形參。 它和vector一樣是模板型別,但是有一點不同的是initializer_list物件中的元素永遠是常量值。
void error_msg(initializer_list<string> li)
{
for (auto beg = li.begin(); beg != li.end(); beg++)
{
cout << *beg << endl;
}
}
省略符形參
省略符是為了便於c++程式訪問某些特殊的c程式碼而設定的。這些程式碼使用了名為varargs的c標準庫功能。
int average ( int n, ... )
{
int sum = n, count = 1, p;
va_list arg_ptr;
if ( n < 0 ) return 0;
va_start( arg_ptr, n ); // arg_ptr指向第一個變參
while( ( p = va_arg( arg_ptr, int ) ) >= 0 ) // 指向下一個引數,並且是int型
{
sum += p;
count++;
}
va_end( arg_ptr ); // 復位指標
return sum/count;
}