C++学习20:运算符重载

来源:互联网 发布:域名需要解析吗 编辑:程序博客网 时间:2024/06/05 16:31

推荐参考:
http://blog.csdn.net/zgl_dm/article/details/1767201

运算符重载是c++多态的一种形式,可以实现将运算符扩展到自定义的类型。
运算符实际是一种函数,先来看运算符函数格式:

<返回类型说明符> operator <运算符> (<参数列表>){    <函数体>}   

对于运算符的重载分为两种:成员函数和友元函数(非成员函数,但与成员函数访问权限相同)。
来看一个例子,现在有一个Time类,其中sum函数就可以使用重载运算符+来替代。

class Time{    private:        int Hour;        int Minute;    public:        void setTime(int h, int m);        Time sum(const Time&t) const;        void showTime() const;};void Time::setTime(int h, int m){    Hour = h;    Minute = m;}Time Time::sum(const Time&t) const{    Time sum;    sum.Minute = Minute + t.Minute;    sum.Hour = Hour + t.Hour + sum.Minute / 60;    sum.Minute %= 60;    return sum;};

下面来使用两种方法重载运算符+实现sum函数功能。

1.成员函数运算符

成员函数重载运算符形式和使用方法类似于成员函数,只是形式上有些不同:

<函数类型> operator <运算符> (<参数列表>){    <函数体>};  

在类中声明成员函数:

Time operator+(const Time&t) const;

定义:

Time Time::operator+(const Time&t) const{    Time sum;    sum.Minute = Minute + t.Minute;    sum.Hour = Hour + t.Hour + sum.Minute / 60;    sum.Minute %= 60;    return sum;}

这样就可以直接使用+来实现sum功能了:

int main(){    Time one,two;    one.setTime(2,40);    two.setTime(5,55);    Time result = one + two;    result.showTime();    system("pause");}

结果如下:

8 hours, 35 minutes请按任意键继续. . .

这里的Time result = one + two;实际可以转换为Time result = one.operator+(two);

2.友元函数运算符

友元函数形式如下,增加了friend关键字:

friend <函数类型> operator <运算符> (<参数列表>){    <函数体>};  

在类中声明友元函数,注意+号是为二元运算符,需要两个参数:

friend Time operator+(const Time&t1, const Time&t2);

定义前是不需要写friend关键字的:

Time operator+(const Time&t1, const Time&t2){    Time sum;    sum.Minute = t1.Minute + t2.Minute;    sum.Hour = t1.Hour + t2.Hour + sum.Minute / 60;    sum.Minute %= 60;    return sum;};

这样可以实现和刚刚成员函数运算符相同的功能了,但是其实际运行时转换为函数调用形式应为:

Time result = operator+(one,two);

3.重载限制

1.重载后的运算符必须至少有一个操作数是用户定义的类型,这是为了防止用户为标准类型重载运算符。
2.使用运算符时不能违背原运算符的语法规则。
3.只能重载已有的运算符,不能创建新运算符。
4.并不是所有运算符都可以进行重载,无法重载以下运算符:
sizeof——sizeof运算符
.——成员运算符
.*——成员指针运算符
::——作用域解析运算符
?:——条件运算符
typeid——一个RTTI运算符
const_cast,dynamic_cast,reinterpret_cast,static_cast——强制类型转换运算符
5.可重载的运算符中,以下运算符只能使用成员函数进行重载:
()——函数调用运算符
=——赋值运算符
[]——下标运算符
->——通过指针访问类成员的运算符
6.运算符函数只有一个符号,不要随意将运算符定义为与其原始功能不相关的功能。