我们都知道c语言中给两个任意数进行四则运算及比较大小非常容易,符号可以直接用,但在c++中,每个用到的类中数据都不能直接进行四则运算,要加类域,书写非常麻烦。可以采用运算符重载简化。下面举个例子。
运算符重载格式:
T operator #(T &),#为要进行重载的运算符,T为类名
友元函数和成员函数重载举例
#include<iostream>
using namespace std;
class fraction{
private:
int done;
int nume;
const int c;
public:
fraction(int a=0,int b=1):c(9){
nume=a;
done=b;
}
//以下四个自增自减函数都采用this指针,省略了第一个对象
fraction operator ++(){
nume+=done;
return *this;
}
fraction operator ++(int){
nume+=done;
return fraction(nume-done,done);//后缀加注意还原
}
fraction operator --(){
nume-=done;
return *this;
}
fraction operator --(int){
nume-=done;
return fraction(nume+done,done);
}
friend fraction operator *(fraction &m,fraction &n);//如果在类外通过友元函数实现要用两个参数,因为在友元函数无法使用this指针,如果在类内实现两个类对象的相关运算符重载,要用一个参数就行了。
friend int operator >(fraction &b1,fraction &b2);
friend void print(fraction &b);
//下面这个函数参数一个对象是类对象,一个不是,上面的参数两个都是类对象
friend double operator +(fraction &a,double b);//写法正确 ,当一个是类对象,一个是原有数据类型要定义成友元函数才行
/*double operator -(fraction &a,double b){
return a.c-b;
} *///这种写法错误,因为是成员函数,不能实现自定义类型和原有数据类型进行运算符重载
};
void print(fraction &b){
cout<<b.nume<<"/"<<b.done<<endl;
}
int operator >(fraction & b1,fraction & b2){
if(b1.nume*b2.done>b1.done*b2.nume)
return 1;
else return 0;
}
double operator +(fraction &a,double b){
return a.c+b;
}
fraction operator *(fraction &m,fraction &n){
return m.c*n.c;
}
int main(){
fraction x;
x--;
print(x);
x++;
print(x);
--x;
print(x);
++x;
print(x);
fraction y(5,1);
printf("%d ",x>y);
printf("%f",x+1.0);
printf("\n");
int a=x+7.0;
cout<<endl<<a<<endl<<x*y<<endl;
return 0;
}
从上面我们可以看出当我们进行四则运算时直接调用我们所写的函数,使代码简单化。另外注意:
可以使用友元函数和成员函数进行运算符重载。
哪些可以重载
但并不是所有运算符都可以重载。
不可以重载的运算符有:. (成员运算符), .* (成员对象选择符),::(解析运算符),?:(条件运算符)
其他的基本上都可以重载,但要注意,如果“+”和“-”重载了,并不代表“+=”重载了,像这种复合运算符自己要单独重载才行。
运算符重载有如下几个特点:
1.重载不能改变运算符的优先级,结合律和操作数。
2.运算符重载的参数至少有一个是类对象或类对象的引用
3.不能创建新的运算符,只能用已有的运算符重载
注意事项:
1.c++规定,“=,(),[ ] ,->,"四种运算符必须重载为类的成员运算符
2.除了赋值运算符=以外,其余可重载的运算符都可以被派生类继承。
3.插入运算符”<<",只能用友元函数重载,不能用成员函数重载,因为它右边输出的类型是原有数据类型,犯了上面例子中代码的错误示范。