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

"&" operator in c++ template function definitions

本文关键字:运算符 定义 函数 C++      更新时间:2023-10-16

我正在编写一个模板BST类,并注意我需要像这样声明"insert"参数:

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->data)

我的想法是,如果我们传递一个指针给一个孩子,那么最终当NULL被发现时,当我们创建一个新节点时,它将位于由leftChild或rightChild指针指向的内存地址。相反,如果我们不添加&操作符,新节点被创建,但没有"连接"到树。

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

谢谢。

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

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

我没有过多地看这个函数,但我认为逻辑要求这个函数也在函数调用之外更新指针。