I read about this from “Effective c++” ,this is Col.10.
It say it’s a good way to have assignment operators return a reference to *this.
I wrote a code snippet to test this idea. I overridden the assignment operator here.And tested it. Everything is fine.
But when I remove that operator overriding, everything is the same. That means, the chaining assignment still works well. So, what am I missing? Why is that? Need some explanation from you guys, THank you.
#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;
}
If you remove completely the
operator=method, a defaultoperator=will be created by the compiler, which implements shallow copy1 and returns a reference to*this.Incidentally, when you write
you’re actually calling this default
operator=, since your overloaded operator is designed to work withints on the right side.The chained assignment will stop working, instead, if you return, for example, a value, a
constreference (=>you’ll get compilation errors) or a reference to something different from*this(counterintuitive stuff will start to happen).Partially related: the copy and swap idiom, i.e. the perfect way to write an assignment operator. Strongly advised read if you need to write an
operator=operator=will perform as if there were an assignment between each member of the left hand operand and each member of the right hand one. This means that for primitive types it will be a “brutal” bitwise copy, which in 90% of cases isn’t ok for pointers to owned resources.