【问题标题】:What does & after a return type mean in C++ OOP在 C++ OOP 中返回类型之后的 & 是什么意思
【发布时间】:2020-09-16 12:47:18
【问题描述】:

所以我有一个下面给出的类的方法,它使用运算符重载将两个复数相乘:

Complex operator*(Complex &c2) {
    Complex temp;

    temp.realPart = realPart * c2.realPart - (imaginaryPart * c2.imaginaryPart);
    temp.imaginaryPart = (realPart * c2.imaginaryPart) + (imaginaryPart * c2.realPart);

    return temp;
}

这似乎工作正常。但是,当我将成员函数头更改为:

Complex& operator * (Complex &c2) {  // Adding & after the class name.

程序没有崩溃,但无法计算答案/程序上的光标闪烁一段时间后结束。类名后面的 & 是什么意思?我已经看到它在返回 this 指针时被使用。

【问题讨论】:

  • 返回类型是对对象的引用。
  • 您正在返回对局部变量的引用。引用是自动取消引用指针的语法糖。在幕后,您将返回一个指向对象的指针,该对象在方法返回时被释放。
  • operator* 应该返回一个新对象,所以返回一个引用是错误的。此外,输入参数应通过const 引用传递:Complex operator*(const Complex &c2)
  • 意识到原来的作品是因为您返回的是temp副本,而不是temp 本身,而参考版本返回的是reference i> 到temp,它位于方法内部的堆栈中。但是返回之后,temp 已经不存在了。这个运算符重载的调用者引用了不再存在的东西,因此出现了奇怪的未定义行为。

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


【解决方案1】:

您正在返回对对象的引用,就像在任何变量旁边一样,现在这在某些情况下很好,但在其他情况下,您可能会返回对临时变量的引用,然后通过任何更改这些临时对象从内存中释放那么您正在引用一个已释放的内存块 Cherno 在他的右值和左值视频中很好地解释了这一点,您可以在这里查看:https://www.youtube.com/watch?v=fbYknr-HPYE

【讨论】:

    【解决方案2】:

    C++中返回类型后面的&是什么意思

    它与任何类型后面的 & 含义相同。这意味着该类型是一个引用。所以,如果是在返回类型之后,那么就意味着函数返回了一个引用。

    您的函数返回一个自动变量。返回对自动变量的引用是没有用的,因为自动对象在返回时就被破坏了,所以引用立即变得无效。

    如果你试图通过返回的无效引用访问不存在的对象,那么程序的行为将是不确定的。

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多