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

标签 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)

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

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 的第一篇文章。此 BST 用于家庭作业,但我问的问题不是。这只是我很好奇的事情。

谢谢。

最佳答案

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

没有理由不能将相同的逻辑应用于指针参数。当你有 node *n 时,会制作指针的拷贝,如果函数内部的指针指向其他内容,则不会更改从外部传递给函数的指针.当参数为node *&n时,如果参数指向函数内部的其他东西,传入的函数外部的指针变量也被更改为指向相同的东西。

我没有过多地查看该函数,但我假设逻辑也需要该函数在函数调用之外更新指针。

关于c++ - "&"c++ 模板函数定义中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22748510/

相关文章:

templates - 开始使用 Latex Beamer 模板编辑

C 函数返回指向指针的指针

两个程序中指针的地址可以相等吗?

c++ - 在编译期间如何检查信号/插槽连接?

c++ - 使用 for_each 修改 std 容器(即使你不应该这样做)

c++ - 如何在模板类中拆分模板友元函数的定义?

C++:无法通过传递给查找器函数来重新分配空初始化的对象指针

c++ - 从python/子进程调用另一个进程需要访问shell

c++ - 如何使用 GMock 模拟 OpenCV 相机,或者如何使用 GTest 测试使用相机的方法?

c++ - 使用字符串而不是类型进行模板化