这几天看到《Effective C++》中条款10中, 令operator= 返回一个reference to *this, 说这个是协议, 并没有强制性,这个协议被所以内置类型和标准程序库提供的类型如string, vector, complex,tr::shared_ptr所接受。
对operator=返回值类型的讨论
举个书上的例子:
int x,y,z;
x = y = z = 15;
(x = y) = z = 15
那么我们将会存在疑问, 为什么返回的不是int, 不是void, 而是int& ?
其实当我们重载一个运算符的时候,好的风格应该是尽量保留运算符原本的特性
考虑一:
x = y = z = 15;
这个赋值语句的顺序是先z = 15,然后在x = (y = z)。如果返回的void类型,那么a = (void)显然是不成立的;
考虑二:
(x = y) = z = 15;
这个赋值语句顺序是先z = 15,然后x = y赋值结束后,然后再将z赋值于x, 再如果返回的类型是int对象,那么就无法修改x的值了。
分别等价于:
x.operator=(y.operator=(z));
(x.operator=(y)).operator=(z);
所以综上考虑,operator=返回值类型是int&是比较好的。
关于this 和 *this
#include <iostream>
#include <vector>
class Foo
{
public:
Foo()
{
this->value = 0;
}
Foo get_copy()
{
return *this;
}
Foo& get_copy_as_reference()
{
return *this;
}
Foo* get_pointer()
{
return this;
}
void increment()
{
this->value++;
}
void print_value()
{
std::cout << this->value << std::endl;
}
private:
int value;
};
int main()
{
Foo foo;
foo.increment();
foo.print_value(); // 返回值 1
foo.get_copy().increment(); // 返回值 1
foo.print_value();
foo.get_copy_as_reference().increment(); // 返回值 2
foo.print_value();
foo.get_pointer()->increment(); // 返回值 3
foo.print_value();
system("pause");
return 0;
}
从这个例子上可以看出,返回引用(return *this)还是得看返回的类型(Foo, 还是Foo&)来决定返回的是对象本身的拷贝,还是对象本身。