C++ 模板函数定义中的"&"运算符
"&" operator in c++ template function definitions
我正在编写一个模板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
时,如果形参指向函数内部的其他内容,则传入函数外部的指针变量也将指向相同的内容。
我没有过多地看这个函数,但我认为逻辑要求这个函数也在函数调用之外更新指针。
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 如何正确实现和访问运算符的各种自定义枚举器
- 自定义先决条件对移动分配运算符有效吗
- 在运算符重载定义中使用成员函数(const错误)
- g++用户定义的动态链接库上的全局new和delete运算符
- 一元"运算符"未在C++中定义
- STL按客户"<"运算符对向量进行排序。为什么要将"<"运算符定义为 const?
- 如何将运算符定义从头文件添加到现有结构?
- 在使用具有相等运算符定义的抽象类时,如何定义父类以减少代码重复?
- 当我们没有将运算符+定义为朋友时?C++
- 没有返回值的c++类成员运算符定义
- 用指向对象的指针和c++中的new运算符定义对象
- <T> 仅为具有运算符/定义的此类 T 创建模板
- 基类中的运算符定义
- C++:不同名称空间中的多个运算符定义
- 运算符定义不能正常工作
- 类运算符'='定义
- 为什么VS不为逻辑运算符定义可选的令牌?
- std::equal_range 不适用于具有运算符<定义的结构