1.先说结论:=, [], (), -> 是只能通过成员函数重载
拿“=”来说,首先,c++规定之只能赋值非静态的数据,静态是不能赋值过来的。那么不能在类外重载的原因就在于友元函数的使用。
在类中如果没有成员函数“=”的重载,就会自动调用自己的构造函数。可以代码测试实现一下
友元函具有访问把类中数据成员声明为“朋友”的权限。就可以在类外调用。那么当把赋值运算符重载函数作为为类的友员函数,在程序中执行类时,程序就会出现两种矛盾的选择。
1、因为它认为类中并没有重载赋值运算符的成员函数,所以它根据C++的规则,会去调用相应的构造函数。
2、但是在全局里,我们已经重载了参数类型为此类类型的赋值运算符函数,而这赋值语句刚好和这函数匹配上了,根据C++的规则,也会去调用这函数。
程序是不允许即调用成员函数中默认的赋值运算符重载(构造函数),又调用通过友元函数加入进来的赋值运算符重载全局函数。
2.总结:
对于剩下的3个运算符 ->, [], () 为什么不能重载为友元函数,也是跟上面一样的道理。即编译器发现当类中没有定义这3个运算符的重载成员函数时,就会自己加入默认的运算符重载成员函数。因此这四个运算符写成友元函数时会报错,产生矛盾。