C++规定=,[ ],(),->这四个运算符只能被重载为类的非静态成员函数,其他的可以被友元重载,主要是因为其他的运算符重载函数都会根据参数类型或数目进行精确匹配,这四个不具有这种检查的功能,用友元定义就会出错。
这个问题很不错唉,有一个问题,举个例子来说,假设有一个类apple,apple a1 = ap2;(ap2已经定义好)与apple a1; a1 = a2;的结果是不一样的,前者是用复制构造函数对a1进行初始化,而第二种形式是先调用构造函数对a1初始化(假设无参),然后调用赋值运算符对象a2的所有成员的值赋值到对象a1中,ok,此时假说如apple中有指针类型的成员变量,这时就存在两个指针指向同一块内存区域的问题,极易造成内存泄漏,此时需要对赋值运算符进行重载,例如:
apple& apple::operator = (const apple & ap){xxxxxx},那么,假如将赋值运算符重载为友元形式,那么一些非左值(比如常量)会被编译器隐式转换成一个临时对象,这样非左值就会出现在=号左边,但是编译器并不会认为它出错,但是这样就破坏掉了=的语义,所以“=”只能重载为成员函数....。
希望对你有帮助。
倘若你是用vc6做编译器的话,那么代码的开头应该写成:
#include
不写成:
#include
using
namespace
std;
就是用上面的一行替代下面的两行。
因为vc6这个编译器不支持在iostream做头文件的时候运行友元函数。
关于这个问题, 有些人的说法是避免二义性。
但我的理解是, 本身就是规范. 是为了书写简单, 同时不容易出错,才规定必须重载为成员的.。
因为, 常规来说, 这几个运算符重载, 都是操作本身成员的, 。
所以重载为成员函数就是自然而然的了.。
开发者干脆就写入规范了.
其实如果没这个规定, 重载为友元, 甚至在极端情况下, 操作的成员都是public情况下, 重载为普通全局函数也是没什么的.。
但既然规定了,就没必要深究原因, 遵循规范就好了.。
一定重载为友元的(一定是多元运算符):当该运算符的第一个运算数为其他类的时候,比如。
cout<<a;<<符号的第一个运算数为iostream类。
原因是,多元运算符重载为成员函数的时候,是调用的第一个运算数的成员函数。
一定重载为成员函数的:一元运算符必须重载为成员函数,其他的任意。