I want to have a good understanding of the use of return *this
and take of instance we have
coord& coord::operator=(const coord& other)
{
if (this== &other)
}
My concern here is the use of this
and the use of return *this
I want to have a good understanding of the use of return *this
and take of instance we have
coord& coord::operator=(const coord& other)
{
if (this== &other)
}
My concern here is the use of this
and the use of return *this
It's quite simple:
coord& coord::operator=(const coord& other)
{
// the test on adresses below is to make sure we're not doing useless work.
// comparing pointers is fast.
// making sure the addresses are different, we know we are not copying
// the object onto itself.
// It is both an optimization, and can, for certain memory operations, avoid bugs
// although modern compilers do avoid the memcpy/memmove bug, which was real pain a
// while back. Some CPUs _will_ puke when asked to copy and source == destination.
if (this != &other)
{
// usually member-by member copy goes here.
}
// returning a reference is standard for copy operations.
// it allows for such syntaxes as:
// coord a, b, c;
//
// a = b = c;
//
// or
// if ((a = b) == c) {}
//
// etc...
//
return *this;
}
Note: this answer only refers to the question about comparing addresses and the need to return a reference. If your class requires memory allocation or copying any of the members may throw, you should check this post: [1]: What is the copy-and-swap idiom? as pointed out by Lightness Races in Orbit.
this means a pointer reference to itself. Before we copy other obj, we should know whether the two objects are the same. If same, we don't need do anything.
Assuming a
and b
are of type coord
, and a simple assignment a = b
is performed, the return *this
in the body of coord &coord::operator=(const coord &)
returns a reference to a
.
The effect of this is to permit chaining of assignments of coord
objects. For example,
a = b = c;
is equivalent to (since assignment is right to left associative)
a = (b = c);
The expression b = c
therefore is therefore turned by the compiler into a call of b.operator=(c)
, which returns a reference to b
. Similarly the assignment of a
is turned into a call of operator=()
, so the above is equivalent to
a.operator=(b.operator=(c));
which (assuming operator=()
is correctly implemented to perform a member-wise assignment) assigns both a
and b
to c
. The reference returned by a.operator=()
is, in this case, ignored by the compiler.
The if (this == &other)
test is an old technique to handle self-assignment (e.g. a = a
) as a special case (e.g. by doing nothing). Such a thing is generally discouraged for various reasons, such as behaving differently if the coord
type has a unary operator&()
. As noted by "Lightness Races in Orbit" in a comment to another answer, it is generally considered preferable to use the copy and swap idiom instead - refer for example to What is the copy-and-swap idiom?.