4-8 运算符重载
本节编程练习不计算学习进度,请电脑登录imooc.com操作

运算符重载

RMB.h

class RMB {
public:
    RMB(int _yuan, int _jiao, int _fen);
    ~RMB();

private:
    int yuan = 0;
    int jiao = 0;
    int fen = 0;
};

RMB.cpp

#include "RMB.h"

RMB::RMB(int _yuan, int _jiao, int _fen)
{
    yuan = _yuan;
    jiao = _jiao;
    fen = _fen;
}

RMB::~RMB()
{

}

为这个类写了些必要的部分之后,我们要完成一个功能,加法功能,1块9毛加2块3毛,用程序应该怎么写呢?我们可以添加一个 Add 函数,如下:

RMB.h

class RMB {
public:
    RMB(int _yuan, int _jiao, int _fen);
    ~RMB();

    RMB Add(const RMB & rmb);

private:
    int yuan = 0;
    int jiao = 0;
    int fen = 0;
};

RMB.cpp

#include "RMB.h"

RMB::RMB(int _yuan, int _jiao, int _fen)
{
    yuan = _yuan;
    jiao = _jiao;
    fen = _fen;
}

RMB::~RMB()
{

}

RMB RMB::Add(const RMB & rmb)
{
    RMB rmbRes(0, 0, 0);

    // 分
    int f = rmb.fen + fen;
    int f_ = f / 10;
    rmbRes.fen = f % 10;

    // 角
    int j = rmb.jiao + jiao + f_;
    int j_ = j / 10;
    rmbRes.jiao = j % 10;

    // 元
    int y = rmb.yuan + yuan + j_;
    int y_ = y / 10;
    rmbRes.yuan = y % 10;

    return rmbRes;
}

这样,我们就实现了一个 Add 函数,如果想要把两个人民币加起来,就可以这样用:

int main(int argc,char **argv)
{
    RMB rmbA(1, 9, 0);
    RMB rmbB(2, 5, 0);

    RMB rmbC = rmbA.Add(rmbB);
    return 0;
}

但是这样看上去好像有点别扭,事实上,在很多不支持运算符重载的语言里,我们都是这样干的。但是在 C++ 里,有一种更好的方式,可以把 + 号进行重载。

我们可以把这个 Add 函数修改成 + 号的重载:

RMB.h

class RMB {
public:
    RMB(int _yuan, int _jiao, int _fen);
    ~RMB();

    // RMB & Add(const RMB & rmb);
    RMB operator + (const RMB & rmb);

private:
    int yuan = 0;
    int jiao = 0;
    int fen = 0;
};

RMB.cpp

#include "RMB.h"

RMB::RMB(int _yuan, int _jiao, int _fen)
{
    yuan = _yuan;
    jiao = _jiao;
    fen = _fen;
}

RMB::~RMB()
{

}

// RMB & RMB::Add(const RMB & rmb)
RMB RMB::operator + (const RMB & rmb)
{
    RMB rmbRes(0, 0, 0);

    // 分
    int f = rmb.fen + fen;
    int f_ = f / 10;
    rmbRes.fen = f % 10;

    // 角
    int j = rmb.jiao + jiao + f_;
    int j_ = j / 10;
    rmbRes.jiao = j % 10;

    // 元
    int y = rmb.yuan + yuan + j_;
    int y_ = y / 10;
    rmbRes.yuan = y % 10;

    return rmbRes;
}

在这样修改之后,使用的时候,我们就可以写出来更优雅的代码了。

int main(int argc,char **argv)
{
    RMB rmbA(1, 9, 0);
    RMB rmbB(2, 5, 0);

    RMB rmbC = rmbA + rmbB;
    return 0;
}

可以看到我们直接把两个对象用 + 号加了起来,这比之前使用函数看起来会好得多。

在 C++ 中,有很多符号都可以重载,也有一些不能被重载。

可重载的运算符:

不可重载的运算符:

. 
.* ->*
::
sizeof
?:
#

任务

  1.  
下一节