MSDN文档中解释到:operator=操作符缺省情况下返回引用—— TYPE& TYPE::operator=(const TYPE&) 为什么呢?我对此的理解是:“=”是个二进制操作符。其传入的参数是引用对象,而其它的参数是类实例,“=”在这个类实例中被重载。而我在实际应用中可以不用返回任何类型(void)来实现赋值操作符,并仍然可以完成赋值操作。我这样做正确吗?如果不正确,那么为什么缺省的实现返回引用呢? 解答: 如果你再花点时间想一想可能就会有答案。其实很简单。operator=返回引用的理由是使你能在一个语句中连接多个赋值。 edu-cn.com TYPE a,b,c,d; … a = b = c = d;
编译器是象这样解释前面一行的:
a = (b = (c = d));
在编译过程中,赋值是右结合的。说白了就是如果你想要玩一下多个赋值,operator=返回的东西必须是右(rhs)赋值。除了返回对对象自身的引用还能有什么呢?这就是为什么operator=最后一行总是返回对this的引用: CMyClass& CMyClass::operator=(const CMyClass& rhs) { ...... // do the // assignment return *this; };
rhs参数被声明为常量的话,就允许常量对象的赋值。没有理由不允许。为什么operator=要返回非常量引用呢?所以不管在哪里你都能使用赋值语句对TYPE进行引用: void MyFunc(TYPE& a); ... TYPE a,b; MyFunc(a=b); // 赋值以后传递
由于operator=返回非常量,你甚至可以使用圆括弧重载通常的等号结合率: TYPE a,b,c; (a = b) = c;