资源描述
第十八章 运算符的重载
运算符重载就是赋予已有的运算符多重含义。C++中通过重新定义运算符,使它能够用于特定类的对象执行特定的功能。例如,通过对+,—,*,/ 运算符的重新定义,使它们可以完成复数、分数等不同类的对象的加减乘除运算操作。这便增强了C++语言的处理能力。
18.1运算符重载的几个问题
1、 哪些运算符可以重载?
几乎所有的运算符都可以重载,除了以下的几个运算符:
., :: ,?:
2、 运算符重载后,优先级和结合性如何?
用户重新定义运算符,不改变原运算符的的优先级和结合性。同时运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。
3、 编译程序如何选用运算符函数?
在每一种编译系统中,运算符实际上都对应一个函数,只是这种运算对用户具有透明性,使用者并不知道函数的存在。运算符重载实际上是运算符函数的重载,所以运算符的重载实际上是函数的重载。
编译程序对运算符重载的选择,遵循着函数重载的选择原则。当遇到不很明显的运算符时,编译程序将去寻找参数相匹配的运算符函数。
4、 重载运算符有哪些限制?
(1) 不可臆造新的运算符
(2) 坚持四个不能改变。
l 不能改变运算符原有的优先级
l 不能改变运算符原有的结合性
l 不能改变运算符原有的语法结构
l 不能改变运算符原有的操作数个数
但允许改变
运算符的返回类型
(3)C++规定,运算符中,参数类型都是内部类型时,不允许重载。 “::、*、->、?:”这五个运算符不能重载。
5、 运算符重载必须遵循哪些原则?
运算符重载可以使程序更加简洁,使表达式更加直观,增强可读性。但是,运算符重载使用不宜过多,否则会带来一定的麻烦。
运算符重载必须遵循以下原则:
(1) 重载运算符含义必须清楚。
(2) 重载运算符不能有二义性。
18.2 运算符重载的定义格式两种形式
运算符重载的定义格式:
返回类型 operator 运算符号(参数说明);
例1:为A类定义一个“++”运算符重载函数
class A
{
...;
A operate ++(A&);
...
};
例2:为A类定义一个“+”运算符重载函数
class A
{
...;
friend A operate +(A&,A&);
...
};
18.3 运算符重载的两种形式
运算符重载的函数有两种形式:成员函数形式和友元函数形式。
1、 重载为成员函数
例18.3.1 下面程序定义一个Time类用来保存时间(时、分、秒),通过重载操作符“+”实现两个时间的相加。
#include <iostream.h>
class Time
{
public:
Time(){ hours=0;minutes=0;seconds=0;} //无参构造函数
Time(int h, int m,int s) //重载构造函数
{
hours=h; minutes=m; seconds=s;
}
Time operator +(Time&); //操作符重载为成员函数,返回结果为Time类
void gettime();
private:
int hours,minutes,seconds;
};
Time Time::operator +(Time& time)
{
int h,m,s;
s=time.seconds+seconds;
m=time.minutes+minutes+s/60;
h=time.hours+hours+m/60;
Time result(h,m%60,s%60);
return result;
}
void Time::gettime()
{
cout<<hours<<":"<<minutes<<":"<<seconds<<endl;
}
void main( )
{
Time t1(8,51,40),t2(4,15,30),t3;
t3=t1+t2;
t3.gettime();
}
输出结果:
13:7:10
例18.3.2 下面程序用来实现复数的加法运算
即:(x+yi)+(a+bi)=(x+a)+(y+b)i
x+yi+a=(x+a)+yi
#include <iostream.h>
class complex
{
public:
complex( ) {real=imag=0; }
complex(double r, double i=0) //虚部可以省略
{
real=r;imag=i;
}
complex operator +(complex & c);
friend void print(complex &c);
private:
double real,imag;
};
complex complex::operator +(complex & c)
{
return complex(real+c.real,imag+c.imag);
}
void print(complex &c)
{
cout<<c.real<<"+"<<c.imag<<"i"<<endl;
}
void main( )
{
complex c1(2.0,3.0),c2(4.0,-2.0),c3;
c3=c1+c2;
print(c3);
c3=c3+complex(3.5);
print(c3);
}
输出结果:
6+1i
2、操作符重载为友元函数形式
例18.3.3 下面程序修改了例18.3.1,将操作符重载为友元函数实现
#include <iostream.h>
class Time
{
public:
Time(){ hours=0;minutes=0;seconds=0;} //无参构造函数
Time(int h, int m,int s) //重载构造函数
{
hours=h; minutes=m; seconds=s;
}
friend Time operator +(Time&,Time&); //重载运算符为友元函数形式
void gettime( );
private:
int hours,minutes,seconds;
};
Time operator +(Time& time1,Time& time2)
{
int h,m,s;
s=time1.seconds+time2.seconds; //计算秒数
m=time1.minutes+time2.minutes+s/60; //计算分数
h=time1.hours+time2.hours+m/60; //计算小时数
Time result(h,m%60,s%60);
return result;
}
void Time::gettime( )
{
cout<<hours<<":"<<minutes<<":"<<seconds<<endl;
}
void main( )
{
Time t1(8,51,40),t2(4,15,30),t3;
t3=t1+t2;
t3.gettime( );
}
输出结果:
13:7:10
例18.3.4 下面程序用友元函数实现复数的加法运算
#include <iostream.h>
class complex
{
public:
complex( ) {real=imag=0; }
complex(double r, double i=0) //虚部可以省略
{
real=r;imag=i;
}
friend complex operator +(complex & c1,complex &c2);
friend void print(complex &c);
private:
double real,imag;
};
complex operator +(complex & c1, complex &c2)
{
return complex(c1.real+c2.real,c1.imag+c2.imag);
}
void print(complex &c)
{
cout<<c.real<<"+"<<c.imag<<"i"<<endl;
}
void main( )
{
complex c1(2.0,3.0),c2(4.0,-2.0),c3;
c3=c1+c2;
print(c3);
c3=c3+complex(3.5);
print(c3);
}
输出结果:
6+1i
9.5+1i
3、其它运算符的重载
展开阅读全文