【问题标题】:Is this a flaw in passing arguments by reference in C++ [closed]这是在 C++ 中通过引用传递参数的缺陷吗[关闭]
【发布时间】: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(&amp;foo); 必须修改 foo,对吗?错了,一直是void do_thing(const Foo*);

标签: c++ pointers reference parameter-passing


【解决方案1】:

确实如此。

但是使用引用会强制您传递左值。

例如你不能通过

mod_ref( *nullptr );

【讨论】:

  • 那个 sn-p 属于编译因为nullptr_t 没有operator*;它与左值无关。 mod_ref( *(int*)nullptr ) 可以正常编译。
  • 是的,但这需要积极的理性决策。我可以reinterpret_cast&lt;double*&gt;(&amp;myint) 到处传递它,但这太荒谬了。
猜你喜欢
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2014-09-11
  • 2016-05-13
  • 1970-01-01
相关资源
最近更新 更多