2016-01-22 123 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对象中打洞)。

相关问题