【问题标题】:Passing a reference argument and returning a reference传递引用参数并返回引用
【发布时间】:2019-09-10 04:55:11
【问题描述】:

我一直在阅读有关运算符重载的文章,并且了解到,如果从函数返回引用,则可以级联重载的运算符。

我的问题是这样的。为了返回引用,您需要将引用传递给函数,还是将值传递给函数?

例如两者都有效吗?

ostream &operator<<(ostream output, string &label);

ostream &operator<<(ostream &output, string &label);

第一个是否也会返回对传递给函数的输出流参数的有效引用,还是需要将输出流对象作为引用传入才能将其作为引用返回?

【问题讨论】:

  • 如果你传递一个值,编译器会发送一个副本。然后您返回对副本的引用,然后行结束,副本被破坏......您的引用悬空。
  • 如果你打算返回一个对传递的东西的引用,那应该作为引用传递。在operator&lt;&lt;() 流式传输到ostreams 的情况下,ostream 必须通过引用传递。按值传递意味着返回对临时(参数)的引用,这会导致未定义的行为。

标签: c++ operator-overloading pass-by-reference


【解决方案1】:

你不能使用

std::ostream &operator<<(std::ostream output, std::string &label);

因为std::ostream 没有复制构造函数。

即使std::ostream有拷贝构造函数,使用上述接口也会导致以下问题。

问题 1

返回对输入参数的引用将是一个问题。函数返回后,对象将不再存在。因此,一旦函数返回,返回的引用将是悬空引用。使用悬空引用会导致未定义的行为。

问题 2

这是假设的。

想象一下如果你使用会发生什么:

std::ofstream outfile("myoutput.txt");
outfile << "A string.";

调用会导致对象切片。您将失去对象的std::ofstream-ness。该函数的输出将放在哪里?它肯定不会进入文件。


坚持

std::ostream &operator<<(std::ostream &output, std::string const& label);

PS是的,我确实将第二个参数的类型更改为const&amp;

【讨论】:

  • 我明白你为什么添加关键字 const。谢谢你:)
猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2022-01-24
  • 2013-11-29
  • 2020-11-27
  • 2013-08-01
相关资源
最近更新 更多