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; }
也在此记录一下吧...
浙公网安备 33010602011771号