雖然這樣做基於二叉搜索樹的一些問題......我在函數調用了有點困惑:「struct node * temp」和「struct node *&temp」之間的區別是什麼?
void find(node* root,node*& temp)
{
blah blah...
}
int main()
{
node* temp=NULL;
node* root=NULL;
find(root,temp);
}
是什麼都傳遞參數之間的區別?
雖然這樣做基於二叉搜索樹的一些問題......我在函數調用了有點困惑:「struct node * temp」和「struct node *&temp」之間的區別是什麼?
void find(node* root,node*& temp)
{
blah blah...
}
int main()
{
node* temp=NULL;
node* root=NULL;
find(root,temp);
}
是什麼都傳遞參數之間的區別?
在
void find(node* root,node*& temp)
root
由值來傳遞。你對*root
所做的任何事情都會反映在來電者身上,但對root
的任何更改都不會。
temp
通過參考傳遞。您對*temp
所做的任何操作都會反映在來電者身上,而任何對temp
的更改也會反映在來電者身上。
所以,我可以使全球溫度使用它們內查找功能,而不是傳遞給函數? – Himanshu
@Himanshu你冷,但全局變量在C++中不滿。 – NathanOliver
我曾嘗試過這個全局變量的概念在c ..但它沒有工作.. – Himanshu
按值傳遞第一個指針函數參數(即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
}
node *root
代表一個指向node
結構(通過值傳遞)的指針。如果你改變這個值,你在這裏改變一個本地的可變值。
node *&temp
表示對指向node
結構的指針的引用。如果更改temp
的值,則可以修改通過引用傳遞的原始指針。
被宣佈上的標識符的前綴&
使得它參考。因爲引用不是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
對象中打洞)。
這與'int'和'int&'之間的區別是相同的,以防您熟悉這些內容。 – molbdnilo