【发布时间】:2021-03-05 13:22:09
【问题描述】:
我在tree 类中编写了以下方法:
public:
node<T> *root;
template<class T>
node<T> *tree<T>::insert(node<T> *p, const T &key) {
if (p == nullptr) {
p = new node<T>(key);
}
//Some code
}
但我注意到即使执行 if 条件,树根的值也没有改变,是什么导致了这种行为?
这就是我在main.cpp 中的调用方式:
tree<int> t1{};
t1.insert(t1.root,7);
很明显,我是按引用而不是按值移动,因为我给了插入一个指向根节点的指针。 (root是指向根的指针)
我希望有人能清楚地解释我做错了什么以及如何解决这个问题,因为我在这个问题上停留了一天。
【问题讨论】:
-
参数
p传值;实际上,它是t1.root的副本。调用者看不到函数中此参数的更改。 -
@IgorTandetnik 为什么它是一个指针
-
@user128250 指针也是值。对于说它们不作为值传递的指针没有特殊的规则(这是一个非常常见的误解)。
-
即使指针是按值复制的,它仍然具有相同的内部值(指向同一个对象)
-
@user128250 其实很简单,只是新手有把事情复杂化的习惯。我相信你会同意你有两个变量
p和root,你用p = ...改变其中一个。为什么要改变另一个变量?如果它们都是整数,它会改变另一个变量吗?为什么指针应该有所不同?事实上,指针并没有什么不同。
标签: c++ class pointers reference