news 2026/6/26 1:43:57

C++ 运算符重载入门:让“+”也能为自定义类型服务!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 运算符重载入门:让“+”也能为自定义类型服务!

🧠 C++ 运算符重载入门:让“+”也能为自定义类型服务!

大家好!今天我们来聊聊 C++ 中一个既强大又容易被滥用的特性——运算符重载。特别是我们最熟悉的+号,在 C++ 中不仅可以用于数字相加,还能让它为我们的自定义类服务!

💡一句话理解:运算符重载就是给已有的运算符赋予新的含义,使其能作用于我们自己定义的数据类型。


🎯 为什么需要重载加号?

想象一下,你定义了一个表示人的类Person,其中有两个属性:m_Am_B。现在你想把两个Person对象“加起来”,比如把他们的属性分别相加,得到一个新的Person

这时候,如果你直接写:

Person p3 = p1 + p2;

编译器会一脸懵:“+” 是干啥的?我只知道怎么加 int、double……你这 Person 是啥?

所以,我们就需要告诉编译器:“当两个Person相加时,请这样做……”


✅ 成员函数方式重载+

来看你写的Person类:

class Person { public: Person() {}; Person(int a, int b) { this->m_A = a; this->m_B = b; } //成员函数实现 + 号运算符重载 Person operator+(const Person& p) { Person temp; temp.m_A = this->m_A + p.m_A; temp.m_B = this->m_B + p.m_B; return temp; } public: int m_A; int m_B; };

这里通过成员函数重载了+运算符。
当你写p2 + p1时,实际调用的是p2.operator+(p1),把p2的成员和p1的成员分别相加,返回一个新对象。


🌍 全局函数方式(注释掉了,但你知道它存在)

你也可以用全局函数来重载(虽然当前代码中被注释了):

//Person operator+(const Person& p1, const Person& p2) { // Person temp(0, 0); // temp.m_A = p1.m_A + p2.m_A; // temp.m_B = p1.m_B + p2.m_B; // return temp; //}

这种方式更对称,适用于左右操作数类型不同的场景(比如int + Person),但成员函数只能处理“左操作数是当前类对象”的情况。


🔁 运算符重载也支持函数重载!

你可能注意到了这段代码:

//运算符重载 可以发生函数重载 Person operator+(const Person& p2, int val) { Person temp; temp.m_A = p2.m_A + val; temp.m_B = p2.m_B + val; return temp; }

这说明:运算符重载本质上还是函数!所以它可以像普通函数一样被重载。
于是你可以同时支持:

  • Person + Person

  • Person + int

非常灵活!


🧪 完整测试代码(原样保留你的实现)

void test() { Person p1(10, 10); Person p2(20, 20); //成员函数方式 Person p3 = p2 + p1; //相当于 p2.operaor+(p1) cout << "mA:" << p3.m_A << " mB:" << p3.m_B << endl; Person p4 = p3 + 10; //相当于 operator+(p3,10) cout << "mA:" << p4.m_A << " mB:" << p4.m_B << endl; } int main() { test(); system("pause"); return 0; }

输出结果:

mA:30 mB:30 mA:40 mB:40

完美!两个Person相加,或者Person加一个整数,都能按我们期望的方式工作。


⚠️ 重要提醒

总结1:对于内置数据类型(如intdouble等)的运算符行为,无法改变。你不能让1 + 2等于 5!
总结2不要滥用运算符重载!重载后的语义应尽量符合直觉。比如+应该表示“组合”或“累加”,而不是删除、打印或其他奇怪操作。


📌 小结

  • 运算符重载让自定义类型也能使用+ - * /等符号。

  • 可通过成员函数全局函数实现。

  • 支持函数重载,可适配不同类型组合。

  • 语义清晰、符合直觉是良好重载的关键!


如果你觉得这篇推文对你有帮助,欢迎点赞、转发,让更多 C++ 初学者少走弯路!
有任何问题,也欢迎在评论区留言交流~


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 14:59:50

终极指南:如何在C++项目中快速集成stduuid库

终极指南&#xff1a;如何在C项目中快速集成stduuid库 【免费下载链接】stduuid A C17 cross-platform implementation for UUIDs 项目地址: https://gitcode.com/gh_mirrors/st/stduuid 作为一名C开发者&#xff0c;你是否曾为生成全局唯一标识符而烦恼&#xff1f;std…

作者头像 李华
网站建设 2026/6/20 20:30:10

STM32中USB协议的完整指南:设备模式配置详解

STM32 USB设备模式开发实战指南&#xff1a;从协议到稳定通信的全链路解析你有没有遇到过这样的场景&#xff1f;精心设计的STM32板子插上电脑&#xff0c;系统却反复弹出“无法识别的设备”&#xff1b;或是枚举成功后数据传着传着就卡死、丢包——这些看似玄学的问题&#xf…

作者头像 李华
网站建设 2026/6/13 21:26:59

TogetherJS实时协作技术深度解析:从并发冲突到完美同步

TogetherJS实时协作技术深度解析&#xff1a;从并发冲突到完美同步 【免费下载链接】togetherjs 项目地址: https://gitcode.com/gh_mirrors/tog/togetherjs 在当今的数字化协作环境中&#xff0c;多人同时编辑同一文档已成为常态。然而&#xff0c;当多个用户同时对同…

作者头像 李华
网站建设 2026/6/21 13:43:38

写论文软件哪家强?宏智树AI凭这5大绝技称霸学术江湖!

在学术写作的江湖里&#xff0c;论文是每位学子必闯的“试炼场”。但面对堆积如山的文献、复杂的数据分析&#xff0c;以及让人头疼的格式调整&#xff0c;不少人感叹&#xff1a;“写论文比打怪升级还难&#xff01;”别急&#xff0c;如今AI技术已渗透学术圈&#xff0c;各类…

作者头像 李华