C++多态的表现形式-重载

一、函数重载

.//待完善

二、运算符重载

1.引入

考虑运算符*,有两个作用,一是用于地址,得到存储在这个地址中的地址;二是用于两个数之间,得到两个数字的乘积。C++会根据操作数的数目和类型来决定采用哪种操作(与计算机组成原理中提到的多地址指令挺像的)。同时C++也允许将运算符的重载扩展到用户定义的类型,也就是说我们可以自己实现的运算符重载。

2.重载+运算符

为了便于理解,我们这里举一个+的例子。+是支持int和string等类型的操作,现在我们需要新增一个时间相加的操作。最传统的方式是声明并定义一个函数。如下:

class Time {
private:
    int hours;
    int minutes;
public:
    Time();
    Time(int h, int m);
    Time Sum(const Time &t) const;
};

Time::Time(int h, int m) {
    hours = h;
    minutes = m;
}

Time Time::Sum(const Time &t) const {
    Time sum;
    sum.minutes = minutes + t.minutes;
    sum.hours = hours + t.hours + sum.minutes / 60;
    sum.minutes = sum.minutes % 60;
    return sum;
}

 但是在调用的时候就需要调用这个Sum函数。如下

    Time t1(2, 20);
    Time t2(12, 50);
    Time t3 = t1.Sum(t2);

最终结果是t3=15h10m。

重载运算符+的操作也与此类似,只需要将上述函数体的Sum改写成operator+即可,如下:

class Time {
private:
    int hours;
    int minutes;
public:
    Time();
    Time(int h, int m);
    Time operator+(const Time &t) const;
};

Time::Time(int h, int m) {
    hours = h;
    minutes = m;
}

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

调用的方法可以将其整体看成一个函数,只是函数名比较奇怪,如下:

    Time t1(2, 20);
    Time t2(12, 50);
    Time t3 = t1.operator+(t2);

但是这样调用就没有什么意义了,也违背了我们想重载运算符+的初衷。所以正确的调用方法如下:

    Time t1(2, 20);
    Time t2(12, 50);
    Time t3 = t1 + t2;

这里,运算符左侧的对象(t1)是调用对象,运算符右边的对象(t2)是作为参数被传递的对象。

 

上述代码运行起来报错:

【Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "public: __thiscall Time::Time(void)" (??0Time@@QAE@XZ) referenced in function "public: class Time __thiscall Time::operator+(class Time const &)const " (??HTime@@QBE?AV0@ABV0@@Z) 4 E:\DemoProject\CPPLearning\4\4.obj 1】

【类定义了一个函数而没有实现,需要添加构造函数的实现】

Time::Time() {
    hours = 0;
    minutes = 0;
}

 

也在此记录一下吧...

 

posted on 2021-01-21 15:17  freden  阅读(124)  评论(0)    收藏  举报