2016-01-22 122 views

回答

2

void find(node* root,node*& temp) 

root由值來傳遞。你對*root所做的任何事情都會反映在來電者身上,但對root的任何更改都不會。

temp通過參考傳遞。您對*temp所做的任何操作都會反映在來電者身上,而任何對temp的更改也會反映在來電者身上。

+0

所以,我可以使全球溫度使用它們內查找功能,而不是傳遞給函數? – Himanshu

+0

@Himanshu你冷,但全局變量在C++中不滿。 – NathanOliver

+0

我曾嘗試過這個全局變量的概念在c ..但它沒有工作.. – Himanshu

0

按值傳遞第一個指針函數參數(即node *root)(即原函數對象的副本在函數中傳遞),第二個函數參數(即node*& temp)通過引用傳遞(即,在函數中傳遞原始指針的別名)。

考慮下面的例子:

void find(node* root,node*& temp) { 
    root = z; 
    temp = z; 
} 

int main() { 
    node *root = x; 
    node *temp = y; 
    find(root, temp); 
    // at this point root still points to x 
    // temp changed and points to z 
} 
2

node *root代表一個指向node結構(通過值傳遞)的指針。如果你改變這個值,你在這裏改變一個本地的可變值。

node *&temp表示對指向node結構的指針的引用。如果更改temp的值,則可以修改通過引用傳遞的原始指針。

0

被宣佈上的標識符的前綴&使得它參考。因爲引用不是const,所以參數表達式必須是左值(即必須指定一個對象)。該功能可以修改該對象!

如果該函數不修改對象,並且不嘗試傳遞不是對象的內容(如空指針常量),則不會注意到任何差異。

聲明的類型不變;無論哪種方式,該類型是node *。參考不是類型;這是名稱如何引用價值的一個方面。

舉例來說,如果我們有:

int x = 0, y = 2; 

有兩個對象。如果我們聲明y作爲參考,有int類型的一個對象,它實際上有兩個名字:

int x = 0, &y = x; 

,參考值的初始化是x對象本身,而不是x的價值。

當我們聲明一個函數參數作爲參考時,它將成爲一個「參考參數」。函數通過該參數接收值的方式從通過C繼承的通常「傳遞值」語義改變。

也可以將引用綁定到const類型。 Const參考參數是好奇的;它們可以接收文字對象的值:

void foo(const int &x); // can be called as foo(42); ! 

常量引用是有用的,因爲當你傳遞一個const引用到一個類的對象,它類似於「按值傳遞」,但因爲對象本身傳遞便宜(不復制施工發生)。

Const引用被引入到C++中以解決「複製構造函數的參數應該是什麼?」的問題。副本構造函數不能是這樣的:

some_class::some_class(some_class original_obj) { /*...*. } 

,因爲這創造了一個雞和蛋的問題:傳遞對象的拷貝構造函數需要一個副本(由於值語義),這需要一個拷貝構造函數! Const參考發明救援:

some_class::some_class(some_class &original_obj) { /*...*. } 

問題解決了;拷貝構造函數通過引用接收對象,但由於對象是準不可修改的,所以它是準安全的。 (準,因爲在某些時候,mutable關鍵字被髮明用於在const對象中打洞)。

相關問題