这是在 C++ [已关闭] 中通过引用传递参数的缺陷吗?

Is this a flaw in passing arguments by reference in C++ [closed]

提问人:Francis Cagney 提问时间:12/12/2021 最后编辑:Remy LebeauFrancis Cagney 更新时间:12/12/2021 访问量:85

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

1年前关闭。

我一直认为这是整个引用概念中的一个缺陷:

请考虑下面的代码片段。我可以看到,当我打电话时,可能会改变。因为我正在传递指向它的指针。mod_pointer(&myint)myint

但是当我打电话时,不太清楚是否可以修改。事实上,C 程序员会认为完全可以避免修改,因为它似乎是按值传递的。mod_ref(myint)myintmyint

您必须查找 的定义,在非平凡的程序中,该定义将位于单独的包含文件和模块中。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++ 指针 引用 参数传递

评论

1赞 JohnFilleau 12/12/2021
这是一种风格,伙计。无论哪种方式,您都需要查看函数声明/文档,因为不能保证您通过地址传递的参数被修改 - 这取决于函数逻辑。为什么要调用一个你不了解接口的函数?
2赞 François Andrieux 12/12/2021
一个带着C先入之见来到C++的C程序员会过得很糟糕,不仅仅是因为这个。您应该了解调用的函数的参数类型,而不应仅依靠调用站点来弄清楚。C++ 函数参数类型非常富有表现力。还应该有额外的上下文线索,表明函数会改变参数,即它的名称和你调用它的原因。据推测,如果您调用,则选择包含该函数调用是为了与修改相关的特定目的,而不仅仅是为了查看会发生什么。mod_refmyint
0赞 Pete Becker 12/12/2021
“引用使得更难猜测函数对其参数做了什么”并不是引用的缺陷。
1赞 JohnFilleau 12/12/2021
还有一件事:必须修改,对吧?错了,一直都是这样!void do_thing(&foo);foovoid do_thing(const Foo*);

答:

1赞 user8143588 12/12/2021 #1

这是真的。

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

例如,您不能通过

mod_ref( *nullptr );

评论

0赞 Sneftel 12/12/2021
该代码段需要编译,因为没有 ;它与左值无关。 会编译得很好。nullptr_toperator*mod_ref( *(int*)nullptr )
0赞 12/12/2021
是的,但这需要积极的理性决策。我可以到处传递它,但这太荒谬了。reinterpret_cast<double*>(&myint)