函數形參

非引用形參和引用形參

 

 

指針形參

 

 

 

 

 

指針引用形參

 

 

 

總結:

非引用形參

(1)普通的非引用類型的參數通過複製對應的實參實現初始化。當用實參副本初始化形參時,函數並沒有訪問調用所傳遞的實參本身,因此不會修改實參的值。

(2)指針形參(也屬於普通的非引用形參)

函數的形參可以是指針,此時將複製實參指針。與其他非引用類型的形參一樣,該類形參的任何改變也僅作用於局部副本。如果函數將新指針值賦值給形參,主調函數使用的實參指針的值的動作等價。的值沒有改變。但是可以改變形參指針所指對象的值,效果同利用實參的*來改變所指對象

(3)複製實參的侷限性

複製實參並不是在所有情況下都適合,不適宜複製實參的情況包括:

當需要在函數中修改實參的值時。

當需要以大型對象作爲實參傳遞時,複製對象所付出的時間和存儲空間代價往往過大。

當沒有辦法實現對象的複製時。

對上述幾種情況,有效的解決方法是將形參定義爲引用或是指針類型。

引用形參

與所有引用一樣,引用形參直接關聯到其所綁定的對象。每次調用函數,引用形參被創建並與相應的實參關聯。                                                                

 

引用

引用還可以用於定義一些函數,使它們既可以被用在賦值的左邊,也可以用在右邊。

例如:《STL源碼剖析》紅黑樹那章中

Root( ) = header;

Leftmost( ) = header;

.the c++ programming language》中舉了這樣一個例子,非常好:

定義Pair如下:

struct Pair{

string name;

double val;

};

基本想法就是讓每個string有一個關聯於它的浮點值。很容易定義一個函數value( ),讓它維護一個Pair的數據結構,由曾經提供給它的所有不同的字符串組成。在此採用一個非常簡單的且低效的實現:

vector<Pair> pairs;

 

double& value(const string& s)

{

for(int i = 0; i < pairs.size(); i++)

if(s == pairs[i].name) return pairs[i].val;

Pair p = {s, 0};

pairs.push_back(p);

return pairs[pairs.size()-1].val;

}

 

void  main()

{

string buf;

while(cin>>buf) value(buf)++;

for(vector<Pair>::const_iterator p = pairs.begin(); p!= pairs.end(); ++p)

cout<<p->name<<":"<<p->val<<'\n';

}

這個功能可以被理解爲一個浮點值數組,它以字符串爲下標。對給定的參數串,value()找到對應的浮點對象(而不是浮點對象的值),返回到這個對象的一個引用。每次while循環從標準輸入流cin將一個單詞讀入buf,並更新與它相關的計數器。最後結果的表裏是輸入中遇到的所有互不相同的詞。最後將它們打印出來。例如:給定輸入

  aa bb bb aa aa bb aa aa

程序將產生:

aa :5

bb :3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章