C++模板函数定义中的“&”运算符

Posted

技术标签:

【中文标题】C++模板函数定义中的“&”运算符【英文标题】:"&" operator in c++ template function definitions 【发布时间】:2014-03-30 19:10:19 【问题描述】:

我正在编写一个模板 BST 类,并注意到我需要像这样声明“插入”参数:

void BST<TYPE>::insert(TYPE iData, int line, node *&n)

代替:

void BST<TYPE>::insert(TYPE iData, int line, node *n)

唯一的区别是传递节点指针的“&”。该函数的完整代码为:

template <class TYPE>
void BST<TYPE>::insert(TYPE iData, int line, node *&n)
    if(n == NULL)
        n = new node(iData, line, NULL, NULL, NULL);
    
    else if(iData < n->data)
        insert(iData, line, n->leftChild);
    
    else if(iData > n->data)
        insert(iData, line, n->rightChild);
    
    else if(iData == n->data)
        while(n->head != NULL) //traverse to end of list
            n = n->head;
        
        n->head = new node(iData, line, NULL, NULL, NULL); //add p to end of list
    

树包含重复项,这就是为什么会有else if(iData == n-&gt;data)

我的想法是,如果我们将一个指针传递给一个子节点,那么最终当找到NULL 时,当我们创建一个新节点时,它将位于内存中由leftChild 或rightChild 指针指向的地址。相反,如果我们不添加 &amp; 运算符,似乎会创建新节点但不会“连接”到树。

我想知道是否有人可以在这里解释语法。另外,我为任何违反礼节的行为道歉;这是我关于 SO 的第一篇文章。这个 BST 用于家庭作业,但我问的问题不是。这只是我很好奇的事情。

谢谢。

【问题讨论】:

阅读书中关于参考文献的章节。 【参考方案1】:

当你有一个函数参数int&amp; i时,函数内部对i的任何改变,也会改变传递给函数的变量。当参数为int i时,会在函数内部进行复制,对参数的任何更改都不会影响传递给函数的变量。

没有理由不能将相同的逻辑应用于指针参数。当您拥有node *n 时,会生成指针的副本,并且如果使函数内部的指针指向其他内容,则从外部传递给函数的指针不会更改。当参数为node *&amp;n时,如果使参数指向函数内部的其他东西,那么传入的函数外部的指针变量,也被改为指向相同的东西。

我没有看太多函数,但我认为逻辑需要这个函数也更新函数调用之外的指针。

【讨论】:

这是有道理的。那么,通过&amp; 传递地址和通过* 传递指针之间到底有什么区别? @Joseph 你的意思是node *&amp;node ** 之间除了语法之外的区别吗?不多。引用是变相的指针。 实际上,我指的是int &amp;int * 之间的区别。所以如果我有一个计算平方的函数,那么如果我有void squares(int * x),那么我不能直接更新那个位置的值吗?或者这与“使指针指向其他东西”有什么不同? 为了将一个 int 变量传递给函数并对其进行修改,void squares(int * x)void squares(int &amp; x) 本质上是一回事。但是,如果不记录代码,则第一个应该采用数组还是可以为 null 是模棱两可的。 所以我认为我的困惑是接收指针并取消引用它以更改指向的值与接收指针并更改它指向的内容不同。

以上是关于C++模板函数定义中的“&”运算符的主要内容,如果未能解决你的问题,请参考以下文章

❥关于C++之类的复制构造函数&赋值运算符

C++模板类中的成员函数以及模板函数在类外定义的方式

C++ ---模板(初识)

复制构造函数中的c ++用户定义成员

C++中定义比较函数的三种方法

C++模板初阶