c++中如何重载运算符_c++运算符重载实例
发布时间 - 2026-01-12 00:00:00 点击率:次重载 operator+ 必须返回值类型 MyClass 而非引用,避免返回局部对象引用;二元运算符建议用非成员友元函数;operator[] 需提供 const 与非 const 两版本;operator== 参数必须为 const 引用。
重载 operator+ 时必须返回新对象,不能返回引用
很多初学者在重载加法运算符时写成 MyClass& operator+(const MyClass& a, const MyClass& b),这会导致返回局部对象的引用,引发未定义行为。正确做法是返回值类型为 MyClass(非引用),让编译器管理临时对象生命周期。
- 如果类含动态内存(如
int*成员),需确保拷贝构造函数和析构函数已正确定义,否则return MyClass(result)可能造成浅拷贝问题 - 对于大型对象,可考虑移动语义:用
MyClass operator+(MyClass&& a, const MyClass& b)配合std::move优化性能 - 二元运算符建议用非成员函数重载(友元),便于左侧操作数类型隐式转换;若需访问私有成员,声明为
friend
重载 operator[] 要提供 const 和非 const 两个版本
否则 const MyClass obj; obj[0] = 42; 会编译失败,而 obj[0] 在 const 对象上调用时又可能意外允许修改——这是常见权限失控源头。
class MyClass {
std::vector data;
public:
int& operator[](size_t i) { return data[i]; }
const int& operator[](size_t i) const { return data[i]; }
};
- 不提供 const 版本:const 对象无法调用
operator[] - 只提供 const 版本:非 const 对象调用后返回
const int&,无法赋值 - 两个版本返回类型必须严格匹配语义:非常量版本返回
int&,const 版本返回const int&
重载 operator== 不要漏掉 const 引用参数
写成 bool operator==(MyClass& a, MyClass& b) 看似能用,但会拒绝所有临时对象和 const 对象比较,比如 func() == obj 或 const MyClass x; x == y 全部报错。
- 正确签名必须是
bool operator==(const MyClass& a, const MyClass& b) - 推荐定义为非成员函数(友元或普通函数),保持对称性;避免成员函数版本中
lhs == rhs和rhs == lhs行为不一致 - 若类继承自基类,且需多态相等判断,
operator==不适合做虚函数,应改用虚函数virtual bool equals(const Base& other) const
流插入 operator 必须返回 std::ostream& 并声明为友元
std::ostream& 并声明为友元因为左操作数是 std::ostream(标准库类型),无法修改其定义,所以只能在类外定义该运算符,且需访问类私有成员时加 friend 声明。
class MyClass {
int value;
friend std::ostream& operator<<(std::ostream& os, const MyClass& obj) {
os << "MyClass(" << obj.value << ")";
return os;
}
};
- 返回
std::ostream&是为了支持链式调用:cout - 参数必须是
const MyClass&,否则cout (临时对象)无法绑定到非常量引用 - 不要在函数体内抛异常,
std::ostream的错误状态应通过os.fail()检查,而非异常机制
const 对象、右值、std::ve
ctor 的 push_back 和 sort —— 这些地方最容易暴露设计缺陷。
# c++
# 隐式转换
# 常量
# 运算符
# 多态
# 成员函数
# 构造函数
# 析构函数
# const
# bool
# int
# 继承
# 重载运算符
# 虚函数
# 值类型
# 引用参数
# 函数重载
# 运算符重载
# operator
# 对象
# 链式
# 而非
# 返回值
# 这是
# 报错
# 只提供
# 最容易
# 这会
# 绑定
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
网站优化排名时,需要考虑哪些问题呢?
如何在阿里云高效完成企业建站全流程?
如何在IIS中配置站点IP、端口及主机头?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何使用模型观察者?(Observer代码示例)
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
jquery插件bootstrapValidator表单验证详解
北京网站制作公司哪家好一点,北京租房网站有哪些?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
如何确保西部建站助手FTP传输的安全性?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel如何配置Horizon来管理队列?(安装和使用)
如何在景安云服务器上绑定域名并配置虚拟主机?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
北京的网站制作公司有哪些,哪个视频网站最好?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
北京网站制作的公司有哪些,北京白云观官方网站?
Python文本处理实践_日志清洗解析【指导】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Java遍历集合的三种方式
如何在万网ECS上快速搭建专属网站?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
如何快速查询网站的真实建站时间?
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
如何在VPS电脑上快速搭建网站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何在自有机房高效搭建专业网站?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
装修招标网站设计制作流程,装修招标流程?
音乐网站服务器如何优化API响应速度?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
zabbix利用python脚本发送报警邮件的方法
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
手机网站制作与建设方案,手机网站如何建设?


ctor