前言:之前的文章中提到过函数重载,今天来看看运算符重载
1.概念
1.运算符重载的定义:对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。
2.实现过程中,首先把指定的运算表达式转化为对运算函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用达标函数。
3.和函数重载一样,运算符重载也存在一定规则:
(1)重载运算符不允许创造新的运算符。
除以下几个以外,C++中的所有运算符都可以重载直接成员访问运算符(.)、成员指针运算符(*)、作用域解析运算符(::)、条件运算符(?:)和sizeof 运算符。
(2)运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。
(3)重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。
(4)运算符重载不能改变运算符作用于内部类型对象的含义,它只能和用户自定义类型的对象一起使用,或者在用户自定义类型的对象和内部类型的对象混合使用时使用。
(5)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。重载的功能应当与原有功能类似,避免没有目的地使用重载运算符。
(6)C++中的大多数运算符都可以通过成员或非成员函数进行重载,但是赋值运算符(=)、函数调用运算符(())、下标运算符([ ])和通过指针访问类成员的运算符(->)只能通过成员函数进行重载。
2.运算符重载的实现
1.两种实现方式:重载为类的成员函数和重载为类的友元函数。
(1)重载为类的成员函数。
函数类型 operator 运算符(形参表)
{
函数体;
}
(2)重载为类的友元函数。
friend 函数类型 operator 运算符(形参表)
{
函数体;
}
注:函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算名称。
代码示例:自增运算符“++”的重载。
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Time
{
public:
Time()
{minute=0;sec=0;}
Time(int m,int s):minute(m),sec(s){}
Time operator++ ();
Time operator++ (int);
void display(){cout<<minute<<":"<<sec<<endl;}
private:
int minute;
int sec;
};
Time Time::operator++() //定义前置自加运算符“++”重载函数
{
if(++sec>=60)
{
sec-=60;
++minute;
}
return *this; //返回自加后的对象
}
Time Time::operator++(int) //定义后置自家运算符“++”重载函数
{
Time temp(*this);
sec++;
if(sec>=60)
{
sec-=60;
++minute;
}
return temp; //返回的是自加前的对象
}
int main()
{
Time time1(25,20),time2;
cout<<" time1: ";
time1.display();
++time1;
cout<<"++time1:";
time1.display();
time2=time1++; //将自加前的对象的值赋给time2
cout<<"time1++:";
time1.display();
cout<<"time2:";
time2.display(); //输出time2对象的值
}
运行结果:
time1: 25:20
++time1:25:21
time1++:25:22
time2:25:21
未完待续。。。。。。
欢迎批评指正,更多C++知识请前往专栏。