C++——为什么 operator= 返回对 *this 的引用而不是对 *this 的对象?

标签 c++

class MyClass {
  public:
    ...
    MyClass & operator=(const MyClass &rhs); // return MyClass&
    ...
  }

为什么不

class MyClass {
  public:
    ...
    MyClass  operator=(const MyClass &rhs); // return MyClass
    ...
  }

是不是因为在这种情况下通过引用返回效率更高?

谢谢

//* 已更新 *

我想我发现关键原因如下:

int i1, it2, i3;
(i1 = i2) = i3; // i3 will be assigned to i1

如果 operator= 的返回类型是 MyClass 而不是 MyClass&,则以下语句的执行与内部数据类型不同。

MyClass mc1, mc2, mc3;

(mc1 = mc2) = mc3;

遵循内置类型使用的规则被认为是一种很好的做法。

// *** update ***

#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i1, i2, i3;

    i1 = 0;
    i2 = 2;
    i3 = 3;

    (i1 = i2) = i3;

    cout << "i1: " << i1 << endl;
    cout << "i2: " << i2 << endl;
    cout << "i3: " << i3 << endl;

    return 0;
}

// output from VS2010
/*
i1: 3
i2: 2
i3: 3
*/

最佳答案

您所说的“为什么不”是什么意思?这真的取决于你。如果需要,您可以返回对象的拷贝而不是引用。这没什么不对,只是它可能确实被证明效率较低。

在许多情况下,人们更喜欢返回引用,因为它更接近内置 赋值运算符的语义。内置运算符返回一个左值,这意味着您可以编写如下代码

int a, b = 0;
int *p = &(a = b);
// `p` now points to `a`

不可否认,它不是很有用,但如果您想保留左值语义,您仍然需要从赋值运算符返回一个引用。

更新

您更新的示例不正确。 (i1 = i2) = i3 表达式导致未定义的行为,而不是您似乎相信的“i3 将被分配给 i1”。的确,赋值运算符返回一个左值这一事实允许您编译像 (i1 = i2) = i3 这样的表达式。但是,这个特定的表达式是无用的,因为行为是未定义的。

在用户定义赋值的情况下,如在您的 (mc1 = mc2) = mc3 示例中,行为已定义,但仍远非有用。你为什么想要做那样的事情?

关于C++——为什么 operator= 返回对 *this 的引用而不是对 *this 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5630150/

相关文章:

c++ - 方便的断言检查策略

c++ - 公共(public)变量和私有(private)变量的命名约定?

c++ - c++如何处理ifstream和char数组的 ">>"操作?

内部类的 C++ vector

c++ - 如何禁用窗口 "Show"动画?

c++ - 没有或有静态设备上下文的 OpenGL 加载纹理?

c++ - Apache HTTP 服务器 - 如何在模块上打印到控制台?

c++ - 元编程,试图避免许多特化

c++ - 在 Visual C++ 中,出现警告但程序没有继续运行,有什么办法可以忽略它吗?

c++ - 如何按结构中的属性值对 std::map 进行排序