运算符的重载本质上是函数的重载,遇到重载过的运算符会去找函数去匹配,然后调用函数完成指定的功能。
=符号的运算符重载函数又被称为拷贝赋值函数
c++规定=号只能重载成类的非静态成员函数,不可以重载为类的今天成员函数或友元函数
不能重载静态成员挺好理解的,因为静态成员函数是对于整个类的,不是属于某个对象的,无this指针导致了它无法操作对象/类的非静态成员(非静态成员函数调用时都会有个默认的this指针)这也是他们俩最大的区别
。
如果类中没有定义拷贝赋值函数或者没有定义自定义移动构造函数的话会自动生成默认拷贝赋值函数,但是如同拷贝函数一般只能实现浅拷贝。(但这不是重点,重点是为啥不能将=重载为类的友元函数)
在对对象进行赋值操作的时候,会在编译的时候自动创建一个(没有定义拷贝赋值函数或者没有定义自定义移动构造函数)拷贝赋值函数 进行简单的浅拷贝
既然提到了自动那么就接近答案了,因为它是编译的时候在类的成员里添加一个拷贝赋值函数,当你用到赋值的时候会先去类中找,类中没有的话那就会自己创建一个,但是这时如果你在友元也创建了一个那么就会造成冲突导致 编译器无法区分到底要用哪个 因为参数都一样且函数名相同,且都可以操作类的对象。
因为程序是不允许有矛盾不确定选择的,所以当赋值运算符重载为类的友元函数时,编译器就会提示错误。
其它三个原理一样。都是因为在成员函数找不到就会创一个新的,但是你又在友元中创了,就不知道到底调用哪一个,导致错误。