/*___________________________________________________________________________________________________________
【文件说明】
运算符重载函数
【程序环境】
win7+vs2010
【创建时间地点】
陕西师范大学
2017.8.17
【作者】
李先生
____________________________________________________________________________________________________________*/
#include<iostream>
#include<string.h>
using namespace std;
/*____________________________________________________________________________________________________________
【运算符重载】
【1】c++是一个队数据类型敏感且以数据类型为中心的程序语言,程序员可以使用基本类型,也可以自定义新类型;
【2】C++丰富的运算符可以作用在基本类型上,这些运算符给程序员提供了简洁的符号,用来操作基本类型数据。程
序员同样可以在自定义类型上使用运算符。
【3】C++不允许创造新的运算符,但允许重载大部分现有的运算符,使得在新类型对象上使用这些运算符时,运算符
可以执行适合那些对象的操作。
【运算符重载的概念】
【1】【运算符重载】就是【对现有的运算符重新进行定义】,赋予其另一种功能,以适应不同的类型。
【2】所谓【重载】就是重新赋予新的含义。
【3】【函数重载】就是对一个已有的函数赋予新的含义,使之适应新的功能。
实际上,我们在不知不觉中已经使用了重载的运算,例如,C++语言本身就重载了加法运算符(+)、减法运算符(—),
在整数算数运算、浮点数算数运算和指针算数运算中,这两个运算符会根据上下文执行不同的运算,适应不同的数据类型。
又如,【<<】是C++位运算中的【左移运算符】,但是在输出操作中又是与【流对象cout】配合使用的【流插入运算符】,
【运算符重载的方法】
【运算符函数】
【1】本质上,【运算符重载】就是【函数重载】,重载运算符就是具有特殊名称的函数,关键字【operator】后接需要重载
的运算符号,称为运算符函数。其定义形式为
返回类型 operator运算符号(形式参数列表)
{
函数体
}
【注意】:像其他函数一样,【运算符函数】具有【返回类型】和【形式参数列表】
:运算符函数的名称就是【operator运算符号】
【2】除了函数调用运算符之外,重载运算符的形参数目(含类成员函数隐式的this指针)与运算符的运算对象数目相同,
而函数调用运算符可以接受任意数目的运算对象。
Fraction Operator+(const Fraction& a,const Fraction& b);
【解释】(1)operator+是函数名,它有两个形参a和b,这是因为加法运算符是双目运算符,由于形参是引用类型,
因此调用operator+函数时实参必须是Fraction类对象或引用
(2)在定义了运算符函数之后,可以说函数operator+重载了运算符+
(3)调用运算符函数的形式如下:
operator运算符号(实参列表)
例如:
Fraction a(1,4),b(1,2),c;
c=operator+(a,b); //规范的写法
上面虽然是规范的函数调用写法,然而它不如运算符表达式来的直观,例如:
c=a+b; //等价于operator+(a,b)的调用
______________________________________________________________________________________________________________*/
class Fraction{
public:
Fraction(int n=0,int d=1):nume(n),deno(d){simplify();}
Fraction(double b); //隐式类类型转换 double类型转换为Fraction类类型的构造函数;
Fraction(const string& str); //隐式类类型转换 string类型转换为Fraction类类型的构造函数
Fraction(const Fraction& f):nume(f.nume),deno(f.deno){} //复制构造函数
Fraction Add(const Fraction&a,const Fraction&b);
friend Fraction operator+(const Fraction&a,const Fraction&b);
void display(); //显示分数
private:
void simplify();
int nume,deno;
};
Fraction::Fraction(const string& str):nume(0),deno(1)
{ //字符串“2/3”转换为分数类
char buf[200];
int i=str.find('/'),j=str.length()-i-1;
if(i>=0)
{
str.copy(buf,i,0); //前面子串转换为分子
buf[i]=0;
nume=atoi(buf);
str.copy(buf,j,i+1); //后面子串转换为分母
buf[j]=0;
deno=atoi(buf);
}
simplify(); //规格化分数
}
Fraction::Fraction(double d):nume(d),deno(1) //分子初始为d的整数部分
{
d = d-nume; //d的小数部分0.25
while(int(d*10)!=0) //0.25=>100
nume=nume*10+int(d*10),deno=deno*10;d=d*10-int(d*10);
simplify();
}
void Fraction::simplify() //规格化分数的实现
{
int m,n,r,s=1;
if(nume!=0&&deno!=0)
{
if(deno<0)
s=-s,deno=-deno;
if(nume<0)
s=s-s,nume=-nume;
m=nume,n=deno;
while(n!=0)
r = m%n, m=n ,n=r;
if(m!=0)nume=s*nume/m,deno=deno/m;
}
else
nume=0,deno=1;
}
void Fraction::display() //输出分数
{
if(deno!=0&&deno!=1&&nume!=deno)cout<<nume<<"/"<<deno;
else cout<<nume;
}
/*___________________________________________________________________________________________________________
【为Fraction类编写成员函数Add和运算符函数operator+】实现两个分数的加法
____________________________________________________________________________________________________________*/
Fraction Fraction:: Add(const Fraction&a,const Fraction&b)
{
return Fraction(a.nume*b.deno+a.deno*b.nume,a.deno*b.deno);
}
Fraction operator+(const Fraction&a,const Fraction&b)
{
return Fraction(a.nume*b.deno+a.deno*b.nume,a.deno*b.deno);
}
/*___________________________________________________________________________________________________________
模块说明:
主函数,我们的程序从这里开始
____________________________________________________________________________________________________________*/
int main()
{
Fraction a(1,4),b(1,2),c,d;
c=a.Add(a,b);
c.display();
cout<<endl;
d=a+b;
d.display();
cout<<endl;
cout<<"ok"<<endl;
system("pause");
return 0;
}