effective c++条款10:令operator= 返回一个reference to *this

版权声明:转载请注明出处,谢谢!!! https://blog.csdn.net/qhdhnbd110/article/details/83411233

如果一个operator=这样写: 

#include <iostream>
using namespace std;
class MyClass
{
public:
	MyClass(int Value):SomeValue(Value){}
	~MyClass(){}
public:
	void operator= (const MyClass &OtherClass)
	{
		this->SomeValue = OtherClass.SomeValue;
	}
private:
	int SomeValue;
};
int main(void)
{
	MyClass A(2);
	MyClass B(3);
	MyClass C(4);
	A = B = C;
        cout << A.SomeValue << " " << B.SomeValue << " "<< C.SomeValue << endl;
	return 0;
}

我们发现编译器无法通过:

如果改成返回一个*this:

#include <iostream>
using namespace std;
class MyClass
{
public:
	MyClass(int Value):SomeValue(Value){}
	~MyClass(){}
public:
	MyClass &operator= (const MyClass &OtherClass)
	{
	    this->SomeValue = OtherClass.SomeValue;
            return *this;
	}
public:
	int SomeValue;
};
int main(void)
{
	MyClass A(2);
	MyClass B(3);
	MyClass C(4);
	A = B = C;
        cout << A.SomeValue << " " << B.SomeValue << " "<< C.SomeValue << endl;
	return 0;
}

这样编译器就可以正常通过:

也就是说,返回一个*this能够实现连锁赋值,对于其他+=等操作符同样适用,但这并不是强制要求的,只不过所有内置类型和标准程序库提供的类型如string,vector等都遵守了这个协议,所以你没什么想法那么就遵守吧。

至于为什么返回一个引用:

1. 返回一个引用可以省去一个构造,一个析构的时间,因为如果不返回引用,那么编译器就需要创建一个this的副本。

2. 如果this对象很大,那么返回一个引用可以节省创建副本所需要的空间。

猜你喜欢

转载自blog.csdn.net/qhdhnbd110/article/details/83411233