1. 程式人生 > >c++ 函式引數傳遞

c++ 函式引數傳遞

指標形參

當函式使用指標作為形參時, 本質也是使用傳值引數, 只是傳遞的是變數的地址,所以可以通過指標修改它所指的物件的值, 但是在c++ 中推薦使用引用型別的形參替代指標。

傳引用引數

使用引用傳參可以避免拷貝操作, 提搞程式的效率。 尤其是拷貝大的類型別或者容器物件比較低效,或者有的類型別就不支援拷貝操作。引用形參也為我們一次返回多個結果提供了途徑。

const形參和實參

初始化過程中,會把頂層const,所以初始化時,形參的頂層const被忽略掉了。當形參有頂層const時,傳給它常量物件或者非常量物件都是可以的。

void func(const int i) {} // func可以讀取i的值,但是不能向i寫值, 這個const 有點多餘,寫入程式碼會很low

另外, 函式的引數儘量使用常量引用。

陣列形參

陣列有兩個特殊的性質:

  1. 不允許拷貝陣列
  2. 使用陣列時(通常)會將其轉換成指標(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; }