【C++】之【运算符重载函数】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32211827/article/details/77837882

/*___________________________________________________________________________________________________________
【文件说明】
	运算符重载函数
【程序环境】
	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;
}










扫描二维码关注公众号,回复: 3759439 查看本文章



猜你喜欢

转载自blog.csdn.net/qq_32211827/article/details/77837882
今日推荐