- 运算符的重载规则
a.运算符重载必须符合语言语法
例如:不能在c++中写
float f;
3.14=f;
所以重载运算符”=”也不能用来下面的操作:
Complex c;
3.14+6i=c;
b.不能重载对内部c++数据类型进行操作的运算符.
例如,不能重载二元浮点减法运算符.
c.不能创建新的运算符,所有重载运算符必须是c++中原来就有的
d.不能重载以下运算符:类成员选择运算符,成员指针运算符,作用域运算符.
2.运算符重载的形式
运算符重载的原型为:
<返回值类型> operator <运算符>(<形式参数表>)
例如:
定义一个complex类
class complex
{
private:
double imag,real;
public:
complex(double a=0,double b=0){real=a;imag=b;}//当无参传入时两者都为0.
complex operator +(complex c);//成员函数重载传入的参数个数都比操作的个数少一个,因为它为复数类,所以返回值也为complex.
};
complex complex::operator +(complex c)
{
complex temp;//定义一个复数类用来保存最后的结果
temp.real=real+c.real;//real默认为当前对象的real,我们也可以用this指针来写.
temp.imag=imag+c.imag;
return temp;
}
在主函数中
c=c1+c2;//在计算机看来,会把它当做c1.operator + (c2);
如果我们需要二元的运算符,这时我们就要将运算符重载定义为友元函数重载运算符.
函数原型为:
friend <返回值类型> operator <运算符>(<形式参数表>).
与成员函数不同,友元函数重载运算符需要的参数个数和操作个数一样多.例:
friend complex operator +(complex c1,complex c2)
{
complex temp;
temp.real=c1.real+c2.real;//因为友元函数没有this指针所以这里也不可以用到this指针
temp.imag=c1.imag+c2.imag;
return temp;
}
在主函数中c1+c2计算机会把它看做为operator + (c1,c2).
Ps:
两种运算符在功能上没有太大的区别,但是友元函数重载运算符更为灵活.
例:
C=3.14+c1;
如果将+用成员函数重载,那么计算就会将它看做为3.14.operator + (c1),那么程序就会报错,如果利用友元函数进行重载,就可以解决这个问题.
单目运算符的重载:
例如:
class Counter
{
private:
Counter(int i=0){value=i;}
Counter operator ++();//这是前缀的++运算符
Counter operator ++(int);//这是后缀的++运算符.
};
在重载中的写法与成员函数运算符重载和友元函数运算符重载类似,--运算符与++运算符的重载一样,括号里面的int没有实际作用,只是为区别前缀和后缀,不需要传入参数.