重载操作符有关问题

重载操作符问题
class       test      
    {      
                public:      
                        test(){}      
                    ~test(){}      
                    test       &       operator=(const       test       &x);      
                private:          
                        int       a;      
    };      
       
    test       &       test::operator=(const       test       &x)      
    {      
                    if       (this       !=       &x)           //检查自付值      
                    {      
                                    a       =       x.a;      
                        }      
                       
                    return       *this;      
    }    

首先,比如定义有两个对象a,b   ,对于语句a=b
=应该是函数的名称   吧   ,b应该是函数的实参吧   ,返回一个test型   的引用,形式是=b,为什么左边加了一个a就算   是调用了这个函数,请问应该怎样理解a=b这个语句是调用了该函数,用到了重载   操作符   ??  


其次,为什么返回值   的类型是test   &???

------解决方案--------------------
当执行 a = b 的时候,实际上是调用了
a.operator = ( b ) 这样的函数,负责把 b的值赋值给a(如果你的函数完成的是这样的功能的话).这是由编译器决定的,也就是说,如果在连续遇到一个标识符、操作符、标识符,并且,该标识符是 '= '号的情况,便将调用这个operator函数,这是编译器完成的事情,你只需要了解它就是这么做的就好了,至于为什么,你得问编译器的开发人员了。

另外,为什么要返回一个*this引用,最通常的一个回答是:让这种操作和内建型别具有一致的行为。尝试下面的代码
int a,b;
a = b = 10;

由于‘=’号的结合顺序是从右至左,所以这行代码应该被分解为下:
1.b = 10;
实际过程是 b = 10,然后 返回b的引用
2.a = (b = 10 );
实际过程是 a = b,再返回a的引用

之后再执行下面的代码:
(a = b) = 20;
你能猜测执行完这行代码之后a,b的值是什么吗?
如果你遵照规则来玩这个游戏,那么a应该是20,b应该是10

这是已经成为事实的东西,你不可能对int型别的行为进行更改,那么我们自己所写的型别就应该尽可能地参照这一规则来进行游戏。否则,有一天你发现你的游戏规则对每个类别都有它自己的规则,那么你到底想客户按照哪个规则来和你玩游戏呢?要知道,在大型开发中,类的数量是上以千计的。