【问题标题】:Function should return reference or object?函数应该返回引用还是对象?
【发布时间】:2011-02-25 02:27:34
【问题描述】:

让我们讨论这两个函数:

  1. complex& operator+=(const T& val);
  2. 复数 operator+(const T& val);

其中“complex”是实现复杂变量的类的名称。

所以第一个操作符返回引用以便可以写成a+=b+=c(相当于b=b+c; a=a+b;)。

第二个运算符返回和objec(NOT A REFERENCE),我们还能写a=b+c+d吗?

谁能解释我这个细微差别?返回引用和对象有什么区别?

【问题讨论】:

    标签: c++ reference operators operator-overloading


    【解决方案1】:

    赋值运算符支持对同一个对象的多次应用:

    (a += b) += c;
    

    这会将bc 添加到a。为此,a += b 必须返回对a 的引用。但是,加法运算符不需要这样做,因为表达式 b + c + d 没有副作用。只有对a 的最终分配有副作用。

    【讨论】:

      【解决方案2】:

      在 1,a+=b 中,+= 操作符修饰 a。因此它可以返回对自身的引用,因为 a 本身就是操作的正确结果。

      但是,在 2. 中需要一个新对象,因为 a+b 返回的东西不是 a,因此返回对 a 的引用是不正确的。

      【讨论】:

        【解决方案3】:

        在某种程度上,细微差别就在你给出的例子中。

        您希望从 + 运算符返回与您开始时的两个不同的值:b+c 既不是 b 也不是 c,它是别的东西。因此,我们不能返回对 b 或 c ... 的引用,也不能在堆栈上分配一个新对象,这将是我们唯一需要使用的两个。因此我们必须返回一个值。

        您已经解释了为什么 += 运算符返回它的作用。

        【讨论】:

          【解决方案4】:

          因为complex& operator+=(const T& val);this 进行操作,并且因为complex operator+(const T& val); 必须为总和创建一个新的临时对象。

          如果您要从 += 返回一个对象,它可能会按照您的预期进行,但其中可能会有一些额外的副本。正如您所提到的,如果您想要链接调用,您会想要这种行为。如果您返回了一个临时的并写了(a += b) += c,那么您添加的c 将在临时销毁时丢失。

          如果您要返回来自+ 的引用,您将获得对临时的引用,并且您的程序将具有未定义的行为。你可以写a=b+c+d,因为b+c会创建一个临时的b1,而b1 + d会创建一个临时的b2,然后分配给a

          【讨论】:

            【解决方案5】:

            在第一种情况下,您正在向左侧的对象添加一些内容,但表达式的值是左侧的对象。所以你通过引用返回一些东西(通常是左边)。例如:

            cout << (a+=b)
            

            在第二种情况下,您添加了两个对象并获得了第三个对象,并且您可以在堆栈上进行此计算,因此您通过值而不是通过引用返回一个实际对象。 例如:

            if(...)
            {
                T a = b + c;
                cout << a;
            }
            

            【讨论】:

              猜你喜欢
              • 2010-12-10
              • 1970-01-01
              • 2014-09-26
              • 1970-01-01
              • 2017-09-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多