c++运算符重载+实例 (一)

2014-11-24 03:23:28 · 作者: · 浏览: 2

【项目2拓展2(思考)】这个思考题吊一下大家的胃口:设定义了两个分数类的对象,如CFraction c1, c2。如果定义了int i,我们能用cin>>i>>j;在键盘上输入i和j的值,是否期望用cin>>c1>>c2;输入分数呢?同理,用cout<

首先要说明:有的C++编译系统(如VC++6.0)没有完全实现C++标准,它所提供的后缀.h的头文件不支持把成员函数重载为友元函数,因此在VC++6.0,应把程序的头两行:

#include

using namespace std;

改为一行:#include //C语言的风格

这是我自己编写的有关运算符重载的程序:


[cpp]
#include

enum style_enum{zero, one, two, three };

class CFraction
{private:
int nume; // 分子
int deno; // 分母
public:
CFraction(int nu=0,int de=1):nume(nu),deno(de){} //构造函数,初始化用

void simplify(); //化简(使分子分母没有公因子)

//输入输出重载
friend ostream& operator<<(ostream &out,const CFraction &cf);
friend istream& operator>>(istream &in,CFraction &cf);

//加减乘除,结果需要化简
friend CFraction operator+(const CFraction &lcf,const CFraction &rcf);
friend CFraction operator-(const CFraction &lcf,const CFraction &rcf);
friend CFraction operator*(const CFraction &lcf,const CFraction &rcf);
friend CFraction operator/(const CFraction &lcf,const CFraction &rcf);

//关系运算符
friend bool operator>(const CFraction &lcf,const CFraction &rcf);
friend bool operator<(const CFraction &lcf,const CFraction &rcf);
friend bool operator>=(const CFraction &lcf,const CFraction &rcf);
friend bool operator<=(const CFraction &lcf,const CFraction &rcf);
friend bool operator==(const CFraction &lcf,const CFraction &rcf);
friend bool operator!=(const CFraction &lcf,const CFraction &rcf);


//取+、-一目运算符
CFraction operator+();
CFraction operator-();
};



void CFraction::simplify()
{
int v1 = nume;
int v2 = deno;
while(v2)
{
int temp = v2;
v2 = v1 % v2;
v1 = temp;
}
nume /= v1;
deno /= v1;
if(deno < 0)
{
deno = -deno;
nume = -nume;
}
}

//输出重载
ostream& operator<<(ostream &out,const CFraction &cf)
{
out << cf.nume << '/' << cf.deno;
return out;
}

//输入重载
istream& operator>>(istream &in,CFraction &cf)
{
char ch;
while(1)
{
in >> cf.nume >> ch >> cf.deno;
if(cf.deno == 0)
cerr << "分母为0请重新输入\n";
else if(ch != '/')
cerr << "格式错误(形如m/n)请重新输入\n";
else break;
}
return in;
}
//加法重载
CFraction operator+(const CFraction &lcf,const CFraction &rcf)
{
CFraction cf;
cf.nume = lcf.nume*rcf.deno + lcf.deno*rcf.nume;
cf.deno = lcf.deno*rcf.deno;
cf.simplify();
return cf;
}
//减法重载
CFraction operator-(const CFraction &lcf,const CFraction &rcf)
{
CFraction cf;
cf.nume = lcf.nume*rcf.deno - rcf.nume*lcf.deno;
cf.deno = lcf.deno*rcf.deno;
cf.simplify();
return cf;
}
//乘法重载
CFraction operator*(const CFraction &lcf,const CFraction &rcf)
{
CFraction cf;
cf.nume = lcf.nume*rcf.nume;
cf.deno = lcf.deno*rcf.deno;
cf.simplify();
return cf;
}
//除法重载
CFraction operator/(const CFraction &lcf,const CFraction &rcf)
{
CFraction cf;
cf.nume = lcf.nume*rcf.deno;
cf.deno = lcf.deno*rcf.nume;
cf.simplify();
return cf;
}
//取正重载
CFraction CFraction::operator+()
{
simplify();
if(nume < 0)
nume = -nume;
return *this;
}
//取负重载
CFraction CFraction::operator-()
{
simplify();
nume = -nume;
return *this;
}


//大于号重载
bool operator>(const CFraction &lcf,const CFraction &rcf)
{
int l_nume = lcf.nume * rcf.deno;
int r_nume = rcf.nume * lcf.deno;
int common_deno = lcf.deno * rcf.deno;
if((l_nume-r_nume) * common_deno > 0) return true;
return false;
}

//小于号重载
bool operator<(const CFraction &lcf,const CFraction &rcf)
{
return