“&安培;” c ++模板函数定义中的运算符

时间:2014-03-30 19:10:20

标签: c++ templates pointers binary-search-tree

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

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

而不是:

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

唯一的区别是&#34;&amp;&#34;用于传递节点指针。该函数的完整代码是:

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->data)的原因。

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

没有理由不能将相同的逻辑应用于指针参数。如果有node *n,则会生成指针的副本,如果使函数内的指针指向其他内容,则不会更改从外部传递给函数的指针。当参数为node *&n时,如果参数指向函数内部的其他内容,则传入函数外部的指针变量也会更改为指向同一事物。

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