赋值运算符在C++中返回对*this的引用

Don*_*Lun 4 c++

我从"Effective c ++"中读到了这个,这是Col.10.它说这是让赋值运算符返回对*this的引用的好方法.我写了一个代码片段来测试这个想法.我在这里重写了赋值运算符.并对其进行了测试.一切都好.但是当我删除那个操作符覆盖时,一切都是一样的.这意味着,链接任务仍然有效.那么,我错过了什么?这是为什么?需要你们的一些解释,谢谢你们.

#include <iostream>

using namespace std;

class Widget{
public:

    Widget& operator=(int rhs)
    {
        return *this;
    }
    int value;

};

int main()
{
    Widget mywidget;
    mywidget.value = 1;
    Widget mywidget2;
    mywidget2.value = 2;
    Widget mywidget3 ;
    mywidget3.value = 3;
    mywidget = mywidget2 = mywidget3;
    cout << mywidget.value<<endl;
    cout << mywidget2.value<<endl;
    cout << mywidget3.value<<endl;

}
Run Code Online (Sandbox Code Playgroud)

Mat*_*lia 6

如果完全删除该operator=方法,operator=编译器将创建一个默认值,该默认值实现浅拷贝1并返回对它的引用*this.

顺便说一下,当你写作

mywidget = mywidget2 = mywidget3;
Run Code Online (Sandbox Code Playgroud)

你实际上是在调用这个默认值operator=,因为你的重载运算符设计用于int右侧的s.

链接的赋值将停止工作,相反,如果你返回,例如,一个值,一个const引用(=>你将得到编译错误)或一个不同的引用*this(反直觉的东西将开始发生).

部分相关:复制和交换习语,即编写赋值运算符的完美方式.如果你需要写一个,强烈建议阅读operator=


  1. 默认情况下operator=,左手操作数的每个成员与右手操作数的每个成员之间都有一个赋值.这意味着对于原始类型,它将是一个"残酷的"按位复制,在90%的情况下,对于拥有资源的指针是不可行的.

  • 如果你的类需要它,你需要实现`operator =`,即如果默认的按位复制不正确.当您拥有指向类所拥有的资源的内存/句柄的原始指针时,通常会发生这种情况; 一个好的经验法则是,如果你需要一个析构函数来释放一些资源,你可能需要一个`operator =`来避免在不同实​​例,双重释放和资源泄漏之间不必要地共享这些资源. (3认同)
  • 对于没有自己的`operator =`的成员来说,它不是真正的副本...它会执行按位复制,但对于实现它的成员(想想`std :: string`),现有的`operator =`对于会员将被使用. (2认同)

Dav*_*eas 5

这个问题涉及两个不同的概念,是否应该定义operator=以及是否应该返回对象的引用。

您应该考虑三者的规则:如果您定义了复制构造函数赋值运算符析构函数之一,则应该定义其中三个。围绕该规则的基本原理是,如果您需要提供析构函数,则意味着您正在管理资源,并且在这样做时,默认的复制构造函数赋值运算符可能不会削减它。举个例子,如果你通过原始指针保存内存,那么你需要在析构函数中释放内存。如果您不提供复制构造函数赋值运算符,则将复制指针,并且两个不同的对象将尝试释放指针所持有的内存。

虽然指针是最常见的示例,但这适用于任何资源。例外的是您禁用复制构造和赋值的类 - 但您又以某种方式将它们定义禁用

关于问题的第二部分,或者是否应该返回对该对象的引用,您应该这样做。与所有其他运算符重载一样,原因是模仿基本类型的现有运算符的功能通常是一个好建议。有时这通过引用给出:当重载运算符时,按照ints do进行操作。