操作符重载的两种形式:
1、重载为类成员函数
2、重载为友元函数
一、运算符形式
1、声明形式
函数类型 operator 运算符(形参)
{
。。。。。。。。
}
2、重载为类成员函数时
参数个数=原操作数个数-1(后置++、--除外)
3、重载为友元函数时 参数个数=原早作数个数,且至少应该有一个
自定义类型的形参。
4、双目运算符 B
1)如果要重载B的类成员函数,使之能够实现表达式 oprd1 B oprd2,其中oprd为A类的对象,
则B应该被重载为A类的成员函数,形参类型应该是oprd2所属的类型。
2)经重载后,表达式oprd1 B oprd2相当于oprd1.operator B(oprd2)。
#include<iostream>
using namespace std;
class complexA
{
int real;
int image;
public:
complexA(int ireal=0,int iimage=0)
{
real=ireal;
image=iimage;
}
complexA operator +(complexA c2);
complexA operator -(complexA c2);
void display();
};
complexA complexA::operator+(complexA c2)
{
complexA c;
c.real=real+c2.real;
c.image=image+c2.image;
return complexA(c.real,c.image);//返回值加complexA 限定,或者写成return c。
}
complexA complexA::operator-(complexA c2)
{
complexA c;
c.real=real-c2.real;
c.image=image-c2.image;
return complexA(c.real,c.image);
}
void complexA::display()
{
cout<<"("<<real<<","<<image<<")"<<endl;
}
int main()
{
complexA c1(5,4),c2(2,10),c3;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
c3=c1-c2;
c3.display();
c3=c1+c2;
c3.display();
return 0;
}
5、前置单目运算符U
1)如果要重载U为类的成员函数,使之能够实现表达式 U oprd,其中oprd为A类的对象,
则U应重载为A类的成员函数,无形参。
2)经重载后,
表达式U oprd相当于oprd.operator U()。
6、后置单目运算符++和--
1)如果要重载++或者--为类的成员函数,使之能够
实现表达式opd++或者oprd--,其中oprd为A类的对
像,则++或--应被重载为A类的成员函数,且具有一个int
类型的形参。
2)经重载后,表达式 oprd++相当于
oprd.operator++(0).
#include<iostream>
using namespace std;
class clock
{
int hour;
int minute;
int second;
public:
clock(int h=0,int m=0,int s=0)
{
hour=h;
minute=m;
second=s;
}
void show()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
void operator++();//前置++运算符
void operator++(int);//后置++运算符
};
void clock::operator++()
{
second++;
if(second>=60)
{
second=second-60;
minute++;
if(minute>=60)
{
minute=minute-60;
hour++;
hour=hour%24;
}
}
cout<<"++clock: ";
}
void clock::operator++(int)
{
second++;
if(second>=60)
{
second=second-60;
minute++;
if(minute>=60)
{
minute=minute-60;
hour++;
hour=hour%24;
}
}
cout<<"clock++: ";
}
int main()
{
clock myclock(23,59,59);
cout<<"first time output:";
myclock.show();
myclock++;
myclock.show();
++myclock;
myclock.show();
return 0;
}