2012-07-14 118 views
0

可能重複:
C++ functions: ampersand vs asterisk
What are the distinctions between the various symbols (*,&, etc) combined with parameters?差異呼籲

我想知道地址運營商&,並在尊重運營商*之間的區別一個C++函數調用。例如採取以下功能

void foo (std::string& param) 
{ 
    param = "Bar."; 
    std::cout << param.size(); 
} 

,讓我們把它在我們像這樣main()功能...

int main() 
{ 
     std::string test; 
     foo(test);   //Why not foo(&test)? 
     std::cout << test; //Prints out the value "Bar." 
} 

首先,爲什麼&運營商允許我分配一個值,如果它是一個指針(當它不是一個指針時,爲它指定一個可以存活RAII的值和函數範圍foo()),因爲它可以在我的main()函數中打印出來,即使它不是static?我假設它不是指針,因爲我可以通過使用.運算符而不是用於指針的->來訪問size()方法。

其次,在函數參數中使用&運算符與使用運算符*之間有什麼區別?它不僅僅是一個簡單的變量,如std::string param?它似乎是這樣調用的(foo(test)而不是foo(&test))。

+0

仔細看看C++ *參考*。 – mavam 2012-07-14 19:36:27

+0

這不是一個操作員,它是一個參考。 – Dani 2012-07-14 19:36:45

+0

http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c – chris 2012-07-14 19:37:18

回答

2

&功能參數明確表示此參數被傳遞,通過參考(大多數編譯器實現這個作爲一個指針),這就是爲什麼你看到這個任務在你main()效果。 static與此無關。

在聲明一個參數使用&*的功能不同的是,第二個允許NULL(或一個不存在的或只是一個普通的無效地址)是傳入的同時&保證有一個真正的對象被這個函數的參數引用。除此之外,兩者都提供了類似的功能,允許通過原始對象的引用來改變原始對象。

0

test自己(沒有&)會傳遞一個副本到函數的字符串,而&意味着它會傳遞一個引用。

僅供參考:如果您不需要參考,最佳實踐會指示將所有對象作爲常量參考傳遞。