C++ 怎么重载运算符 C++ operator+实现对象加法【重载】
发布时间 - 2026-01-28 00:00:00 点击率:次operator+ 必须定义为非成员函数以支持左操作数隐式转换(如 int + MyClass);若仅需 MyClass + MyClass,成员函数可行,但非成员版更通用且常声明为 friend。
operator+ 必须定义为非成员函数还是成员函数?
取决于是否需要左操作数是隐式转换类型(比如 int + MyClass)。如果只支持 a + b 且两个都是 MyClass,成员函数够用;但要支持 5 + obj,就必须用非成员函数(常配 friend),否则左操作数无法触发用户定义的转换。
常见错误:把 operator+ 写成成员函数后,写 5 + obj 报错 no match for 'operator+' (operand types are 'int' and 'MyClass') —— 因为成员版只能以 MyClass 为左操作数。
- 成员版签名:
MyClass MyClass::operator+(const MyClass& other) const - 非成员版(推荐):
MyClass operator+(const MyClass& a, const MyClass& b),通
常声明为
friend以便访问私有成员 - 若需支持混合类型(如
int + MyClass),非成员版可额外重载:MyClass operator+(int n, const MyClass& obj)
返回值类型为什么不能是 void 或引用?
operator+ 的语义是“产生新对象”,不是修改原对象。返回 void 会导致 a + b + c 编译失败;返回非 const 引用(如 MyClass&)会绑定到临时对象,引发悬垂引用;返回 const MyClass& 同样危险——你无法安全返回局部对象的引用。
- 正确返回类型:
MyClass(值语义,安全但可能有拷贝开销;C++17 后 RVO/NRVO 通常消除) - 不推荐返回
MyClass&&或引用,除非你明确控制生命周期(极少见) - 别为了“性能”强行返回引用——加法本就不该复用内存
const 和参数传递方式怎么选?
左值、右值、是否修改原对象,全靠 const 和引用限定符管住。不加 const 会导致无法对常量对象调用,比如 const MyClass a, b; auto c = a + b; 会失败。
- 参数一律用
const MyClass&:避免拷贝,接受左值/右值 - 函数自身加
const(仅成员函数时):MyClass operator+(const MyClass& other) const - 非成员函数不用加
const,因为它本来就不属于任何对象 - 不要写
MyClass operator+(MyClass other)——多一次无谓拷贝
和 operator+= 配合使用更简洁
习惯上先实现 operator+=(成员函数,返回 MyClass&),再用它实现 operator+(非成员),代码更短、逻辑更清晰,也天然支持移动语义(C++11 起)。
MyClass& MyClass::operator+=(const MyClass& other) {
// 修改 this
return *this;
}
MyClass operator+(MyClass a, const MyClass& b) { // 注意:a 是值传入,自动启用移动(若传入右值)
a += b;
return a;
}
这个写法里,operator+ 的第一个参数用值传递,既支持拷贝也支持移动,编译器会自动选择最优路径。比手写两套(拷贝版 + 移动版)更可靠。
容易被忽略的是:如果 MyClass 有资源管理(比如动态数组),必须确保 operator+= 正确处理自赋值(a += a),否则 operator+ 在某些边界情况下会出错。
# c++
# 隐式转换
# 为什么
# 常量
# 运算符
# for
# 成员函数
# const
# auto
# int
# void
# 重载运算符
# 值类型
# operator
# 值传递
# 对象
# 的是
# 都是
# 或引用
# 第一个
# 隐式
# 能有
# 因为它
# 再用
# 报错
# 不属于
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在IIS中新建站点并解决端口绑定冲突?
黑客入侵网站服务器的常见手法有哪些?
Laravel如何优化应用性能?(缓存和优化命令)
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何在新浪SAE免费搭建个人博客?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
微信小程序 配置文件详细介绍
Python正则表达式进阶教程_复杂匹配与分组替换解析
怎么用AI帮你为初创公司进行市场定位分析?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
,网页ppt怎么弄成自己的ppt?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何正确下载安装西数主机建站助手?
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
如何快速上传自定义模板至建站之星?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
如何在Ubuntu系统下快速搭建WordPress个人网站?
Laravel怎么清理缓存_Laravel optimize clear命令详解
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel如何使用Blade模板引擎?(完整语法和示例)
教学论文网站制作软件有哪些,写论文用什么软件
?
Laravel如何处理CORS跨域请求?(配置示例)
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
微信小程序 五星评分(包括半颗星评分)实例代码
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何在万网ECS上快速搭建专属网站?
如何在阿里云域名上完成建站全流程?
如何制作一个表白网站视频,关于勇敢表白的小标题?
Bootstrap整体框架之CSS12栅格系统
Laravel如何实现本地化和多语言支持?(i18n教程)
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Python自动化办公教程_ExcelWordPDF批量处理案例
BootStrap整体框架之基础布局组件
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
javascript基本数据类型及类型检测常用方法小结
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
详解jQuery中的事件
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?


