C++加号运算符重载

1,292 阅读2分钟

(1)运算符重载

一种形式的C++多态,允许将运算符重载扩展到用户定义的类型,编译器将根据操作数的数目和类型决定使用那种符号定义。

运算符重载(operator overloading)只是一种“语法上的方便”,也就是它只是另一种函数调用方式.

例如,将两个数组相加是一种常见的运算。通常使用下面这样的for循环来实现:

 for(int i=0;i<20;i++)
     evening[i]=sam[i]+janet[i];

在C++中,可以定义一个表示数组的类,并重载+运算符。于是便有:

 evening=sam+janet;

这种简单的加法隐藏了内部机理,并强调实质,这是OOP的另一个目标。

计算时间运算重载符:

定义mytime.h头文件

 #ifndef MYTIME_H_
 #define MYTIME_H_

class Time
{
private:
	int hours;
	int minutes;
public:
	Time();
	Time(int h, int m = 0);
	void AddMin(int m);
	void AddHr(int h);
	void Reset(int h = 0, int m = 0);
	Time operator+(const Time & t)const;
	void Show()const;
};
#endif

函数封装--mytime.cpp文件

 #include<iostream>
 #include "mytime.h"

Time::Time()
{
	hours = minutes = 0;
}

Time::Time(int h, int m)
{
	hours = h;
	minutes = m;
}

void Time::AddMin(int m)
{
	minutes += m;
	hours += minutes / 60;
	minutes % 60;
}

void Time::AddHr(int h)
{
	hours += h;
}

void Time::Reset(int h, int m)
{
	hours = h;
	minutes = m;
}
Time Time::operator+(const Time & t)const
{
	Time sum;
	sum.minutes = minutes + t.minutes;
	sum.hours = hours + t.hours + sum.minutes / 60;
	sum.minutes %=60;
	return sum;
}

void Time::Show()const
{
	std::cout << hours << "hours," << minutes << " minutes";
}

main()--usetime.cpp文件

 #include<iostream>
#include"mytime.h"

int main()
{
	using std::cout;
	using std::endl;
	Time planning;
	Time coding(2, 40);
	Time fixing(5, 55);
	Time total;

	cout << "planning time = ";
	planning.Show();
	cout << endl;

	cout << "coding time = ";
	coding.Show();
	cout << endl;

	cout << "fixing time = ";
	fixing.Show();
	cout << endl;

	total = coding + fixing;
	cout << "coding+fixing = ";
	total.Show();
	cout << endl;

	Time morefixing(3, 28);
	cout << "more fixing time = ";
	morefixing.Show();
	cout << endl;
	total = morefixing.operator+(total);
	cout << "morefixing.operator+(total) = ";
	total.Show();
	cout << endl;
	return 0;
}

(2)重载限制

1.重载后的运算符必须至少有一个操作符是用户定义的类型,这将防止用户为标准类型重载运算符。因此不能将减肥运算符(-)重载为计算两个double的和,而不是它们的差。

2.使用运算符时不能违反运算符原来的句法规则。例不能将求模运算符(%)重载成使用一个操作数:

 int x;
 % x;//错误

3.不能创建新运算符。例不能定义operator**()函数来表示求幂.

4.不 能重载以下运算符:

sizeof:sizeof运算符。

.:成员运算符

.*:成员指针运算符

:::作用域解析运算符

?::条件运算符

typeid:一个RTTI运算符.

const_cast:强制类型转换运算符。

以及dynamic_cast和reinterpret_cast和static_cast。

5.一下运算符只能通过成员函数进行重载:

=:赋值运算符。

():函数调用运算符。

[]:下标运算符。

->:通过指针访问类成员的运算符