这个问题很不错唉,有一个问题,举个例子来说,假设有一个类apple,apple a1 = ap2;(ap2已经定义好)与apple a1; a1 = a2;的结果是不一样的,前者是用复制构造函数对a1进行初始化,而第二种形式是先调用构造函数对a1初始化(假设无参),然后调用赋值运算符对象a2的所有成员的值赋值到对象a1中,ok,此时假说如apple中有指针类型的成员变量,这时就存在两个指针指向同一块内存区域的问题,极易造成内存泄漏,此时需要对赋值运算符进行重载,例如:
apple& apple::operator = (const apple & ap){xxxxxx},那么,假如将赋值运算符重载为友元形式,那么一些非左值(比如常量)会被编译器隐式转换成一个临时对象,这样非左值就会出现在=号左边,但是编译器并不会认为它出错,但是这样就破坏掉了=的语义,所以“=”只能重载为成员函数....
希望对你有帮助。
破坏封装,那样会使成员变量就像全局变量那样被任意赋值了