C++:运算符重载
前言
重载我们又称之为多态,重载在编程中的用法非常之多,比如最熟悉的函数重载(基于C++开发的capl语言同样支持函数重载)。当然在C++中仍然支持将多态引用到运算符中,例如 * 运算符可以用于地址,也可以用来两数相乘。本质上,C++运算符的重载由操作数类型决定,这类似于函数重载是由形参列表决定。但需要注意的是运算符重载只支持类定义或者结构定义。
/* *运算符重载 */ int b = 10; int a = 10; int* p = &a;// *作用于地址 int out = *p * b;// *用来相乘 cout << out << endl;
自定义运算符重载
运算符重载小白本人(下文及后续其他文章自称本白)认为是一个非常强大好用得功能,其定义方式为 结构名 operateor 运算符 (参数列表) 就拿C++ plus书的例子来说,如果我们定义了A,B,C三个类,并且三个类成员都在public声明了一个整形变量DD,那借用重载+号运算符我们可以直接:
C=A+B //重载的本质:C.DD=A.DD+B.DD
可能这样大家看起来还不是很清晰,那借用一个例子我们来完整的看运算符重载到底是怎末实现的:
//头文件 #pragma once #include <iostream> using namespace std; class Time { private: int hours; int min; public: Time(); Time(int h, int m = 0); ~Time(); void Add_min(int m);//增加分钟 void Add_Hou(int h);//增加小时 void Reset(int h=0,int m=0) ;//重置类的参数 Time Sum(const Time& t) const;//两个类的时间相加赋值给第三个类,注意返回值不要引用,因为函数执行完毕后会清除创建的Sum类对象 void Show() const;//展示成员值 };
警告:不要返回指向局部变量的引用。函数执行完毕后,局部变量和临时对象将消失(static除外),引用将指向不存在的数据!
//类成员函数定义CPP文件 #include "运算符重载.h" Time::Time() { hours = min = 0; } Time::Time(int h, int m) { hours = h; min = m; } Time::~Time() { } void Time::Add_min(int m) //增加分钟 { int h_add=0; h_add = (m + min) / 60; hours += h_add; min = (m + min) % 60; } void Time::Add_Hou(int h) //增加小时 { hours += h; if (hours > 24) { cout << "ERROR HOURS! PLEASE INPUT AGAIN!" << endl; hours -= h; } } void Time::Reset(int h, int m) //重置类的参数 { min = m; hours = h; } Time Time::Sum(const Time& t) const//两个类的时间相加赋值给第三个类并返回 { Time sum; sum.min = (this->min + t.min); sum.hours = this->hours + t.hours + sum.min/60; sum.min = sum.min % 60; return sum; } void Time::Show() const//展示成员值 { cout << "hours#: " << this->hours << endl; cout << "minutes#: " << this->min << endl; }
//Main函数文件 #include <iostream> #include "运算符重载.h" using namespace std; int main(void) { Time timeSum;//用于存放总和 Time time2(10,23); Time time3(5,40); //没有运算符重载的时候 cout << "没有运算符重载" << endl; timeSum = time2.Sum(time3); timeSum.Show(); return 0; }
运行结果如下:
可以看出不借助运算符重载我们必须自己顶一个Sum函数来进行两个类成员的变量相加,但是当调用时就显得有点臃肿,如果我们使用 + 运算符重载呢?
只要在类声明时声明一个运算符重载,并且定义好其重载的具体对象:
Time Time::operator+(const Time& t) const//定义一个+运算符重载 { Time sum; sum.min = (this->min + t.min); sum.hours = this->hours + t.hours + sum.min / 60; sum.min = sum.min % 60; return sum; }
然后运行main函数:
#include <iostream> #include "运算符重载.h" using namespace std; int main(void) { Time timeSum;//用于存放总和 Time time2(10,23); Time time3(5,40); //没有运算符重载的时候 cout << "没有运算符重载" << endl; timeSum = time2.Sum(time3); timeSum.Show(); //运算符重载 cout << "运算符重载" << endl; timeSum = time3 + time2; timeSum.Show(); return 0; }
运行结果如下:
结论
其实不难发现,这里的+其实对于类来说就是一个成员函数,只不过+号只是简写罢了:
timeSum = time3.operator+(time2);
这也就说明了运算符重载必须是类或者结构,因为operator本质就是一个函数,因此不接受基本变量进行重载!
本文来自博客园,作者:{张一默},转载请注明原文链接:https://www.cnblogs.com/YiMo9929/p/16826703.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)