7.2 用友元或成员函数重载运算符
AopB:
成员函数:A.operator op(B);
友元函数:operator op(A,B);
成员函数:
当一元运算符,或者二元运算符的做操作数是该类的一个对象时,重载运算符函数一般定义为成员函数
A.operator op(B);注意之处在于左操作数是由对象this指针传递,右操作数是由参数传递。这使得它在调用的时候有位置上的局限性。如果左操作数不是对象就会报错。如重载了加号的运算符(对对象里面的数据对应相加)
现在有对象A;
A=A+5;//正确,A.operator+(5);
A=5+A;//错误,5.operator+(A);
首先在重载函数中左右操作数都是类对象,这个无用质疑。
对第一个A=A+5;本质为A.operator+(5);5类型不匹配这个时候就会类型转换如果在A类中没有相应的一个参数的构造函数,这个时候系统编译器时无法进行类型转换的。这时成员重载函数遇到的问题,到那时在友元重载函数也要注意到类型转换是否有相应的构造函数。下面标黄处就是相对应的构造函数,注释掉了之后时过不了编译的。所以在写类的时候构造函数编写时要考虑吧周全!
#includeusing namespace std;class Complex{ public://Complex(int a)//{// Real = a;// Image = 0;// .........}int main(){ Z = Z + 25; //25想要转换为类,但失败了Z=25+Z;//这个就跟不对了,做操作数不是对象 }
相比之下友元函数的优势就显现出来了,左右操作数类型要求相对宽松
小贴士:
如果重载函数返回类型时类类型,如下有一个Complex的类,可以这么写:
Complex operator+(const Complex&C1,const Complex&C2){double r=C1.Real+C2.Real;double i=C1,Image+C2.Image;return Complex(r,i);}
//类名加上构造函数的参数列表,注意没有对象名。这是返回类的一种方法用构造的方法return Complex(r,i);是返回了一个新的对象。有的时候想要返回调用重载函数本身的对象,可以用return *this;
友元函数:
有时左右操作数类型不同,用成员函数重载运算符会碰到麻烦。如上述那样(Z=25+Z;)就会发生错误,但是如果使用友元函数重载,C++语言可以用过构造函数事项数据隐式转换(调用构造函数创建对象)。
如果希望运算符的操作数(尤其是第一个操作数)有隐式转换,则重载运算符是必须用友元函数或普通函数。
下列这些不能用友元函数重载的运算符:= () [ ] ->