【发布时间】:2022-01-15 21:25:34
【问题描述】:
我一直认为这是整个引用概念的缺陷:
考虑下面的代码 sn-p。我可以看到,当我调用mod_pointer(&myint) 时,myint 可能会被更改。因为我正在传递一个指向它的指针。
但是当我调用mod_ref(myint) 时,不太清楚myint 是否可以修改。事实上,C 程序员会认为 myint 不会被修改,因为它似乎是按值传递的。
您必须查找mod_ref 的定义,在一个重要的程序中,它会在一个单独的包含文件和模块中。
事实上,我认为这个缺点超过了通过引用而不是指针传递的所有优点(没有)。
我错过了什么吗?
#include <iostream>
void mod_pointer(int *p) {
*p = 100;
}
void mod_ref(int &p) {
p = 1000;
}
int main() {
int myint = 10;
mod_pointer(&myint);
std::cout << "hello " << myint << std::endl;
mod_ref(myint);
std::cout << "hello " << myint << std::endl;
return 0;
}
【问题讨论】:
-
这是一种风格,伙计。无论哪种方式,您都需要查看函数声明/文档,因为不能保证您通过地址传递的参数被修改 - 这取决于函数逻辑。为什么要调用一个你不理解接口的函数?
-
一个 C 程序员带着 C 的先入之见进入 C++ 将会有一段糟糕的时光,不仅仅是因为这个。你应该了解你调用的函数的参数类型,你不应该仅仅依靠调用站点来弄清楚。 C++ 函数参数类型非常有表现力。还应该有额外的上下文线索表明函数改变了参数,即它的名称和你调用它的原因。据推测,如果您调用
mod_ref,您选择包含该函数调用是为了与修改myint相关的特定目的,而不仅仅是为了看看会发生什么。 -
“引用使人们更难猜测函数对其参数的作用”并不是引用的缺陷。
-
还有一件事:
void do_thing(&foo);必须修改foo,对吗?错了,一直是void do_thing(const Foo*);!
标签: c++ pointers reference parameter-passing