(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.一下运算符只能通过成员函数进行重载:
=:赋值运算符。
():函数调用运算符。
[]:下标运算符。
->:通过指针访问类成员的运算符