我从"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)
如果完全删除该operator=方法,operator=编译器将创建一个默认值,该默认值实现浅拷贝1并返回对它的引用*this.
顺便说一下,当你写作
mywidget = mywidget2 = mywidget3;
Run Code Online (Sandbox Code Playgroud)
你实际上是在调用这个默认值operator=,因为你的重载运算符设计用于int右侧的s.
链接的赋值将停止工作,相反,如果你返回,例如,一个值,一个const引用(=>你将得到编译错误)或一个不同的引用*this(反直觉的东西将开始发生).
部分相关:复制和交换习语,即编写赋值运算符的完美方式.如果你需要写一个,强烈建议阅读operator=
operator=,左手操作数的每个成员与右手操作数的每个成员之间都有一个赋值.这意味着对于原始类型,它将是一个"残酷的"按位复制,在90%的情况下,对于拥有资源的指针是不可行的.这个问题涉及两个不同的概念,是否应该定义operator=以及是否应该返回对象的引用。
您应该考虑三者的规则:如果您定义了复制构造函数、赋值运算符或析构函数之一,则应该定义其中三个。围绕该规则的基本原理是,如果您需要提供析构函数,则意味着您正在管理资源,并且在这样做时,默认的复制构造函数和赋值运算符可能不会削减它。举个例子,如果你通过原始指针保存内存,那么你需要在析构函数中释放内存。如果您不提供复制构造函数和赋值运算符,则将复制指针,并且两个不同的对象将尝试释放指针所持有的内存。
虽然指针是最常见的示例,但这适用于任何资源。例外的是您禁用复制构造和赋值的类 - 但您又以某种方式将它们定义为禁用。
关于问题的第二部分,或者是否应该返回对该对象的引用,您应该这样做。与所有其他运算符重载一样,原因是模仿基本类型的现有运算符的功能通常是一个好建议。有时这通过引用给出:当重载运算符时,按照ints do进行操作。