【C++】令operator= 返回一个reference to *this

这几天看到《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 
#include 
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&)来决定返回的是对象本身的拷贝,还是对象本身

你可能感兴趣的:(c++)