0

0

c++如何重载运算符_c++ operator重载实例【进阶】

尼克

尼克

发布时间:2026-02-12 18:35:03

|

698人浏览过

|

来源于php中文网

原创

重载 operator== 时应使用 const myclass& 参数并加 const 限定符,推荐友元形式以支持隐式转换;含指针需深比较,含标准容器可直接用 ==。

c++如何重载运算符_c++ operator重载实例【进阶】

重载 operator== 时必须注意 const 和参数类型匹配

非 const 成员函数无法被 const 对象调用,而比较运算符理应不修改对象状态。常见错误是写成 bool operator==(MyClass& other),导致 const MyClass a, b; if (a == b) 编译失败。

  • 左侧参数应为 const MyClass&,右侧同理,整个函数加 const 限定符
  • 推荐统一使用友元形式(尤其涉及隐式转换时),避免左侧参数被强制转换而右侧不能
  • 若类有指针成员或动态资源,需深比较;若含 std::vector 等容器,直接用 == 即可,无需手动遍历

重载 operator 必须返回 <code>std::ostream& 并声明为友元

流插入运算符不能是成员函数——因为左侧是 std::ostream,不是你的类。强行写成成员函数会导致 cout 找不到匹配的 <code>obj.operator。

  • 必须定义为非成员函数:std::ostream& operator
  • 通常需访问私有成员,所以加 friend 声明(写在类内)
  • 末尾必须返回 os,否则链式调用如 cout 会中断
  • 不要在函数里 flush(如写 os ),那属于用户控制逻辑

重载赋值运算符 operator= 要处理自赋值和异常安全

默认生成的赋值运算符是逐成员浅拷贝,对含裸指针或资源句柄的类极危险。手写时漏掉自赋值检查(if (this == &other) return *this;)会导致释放自身内存后又尝试读取已释放区域。

  • 函数签名应为 MyClass& operator=(const MyClass& other),返回引用以支持链式赋值
  • 先释放当前资源,再分配新资源——但若 new 抛异常,对象将处于无效状态;更稳妥的是“拷贝-交换”惯用法(copy-and-swap)
  • 若类管理文件句柄、mutex 或 unique_ptr,优先用 RAII 容器替代裸资源,可省去大部分手写逻辑

前置++与后置++ 的实现差异常被混淆

前置版本(++obj)应返回引用,后置版本(obj++)必须返回旧值的副本,且编译器靠哑元 int 参数区分二者。写反了会导致语义错乱或编译失败。

立即学习C++免费学习笔记(深入)”;

  • 前置: MyClass& operator++() { /* 修改 *this */ return *this; }
  • 后置: MyClass operator++(int) { MyClass tmp(*this); ++(*this); return tmp; }
  • 后置版本性能略差(多一次拷贝),除非接口需要,否则优先提供前置版本
  • 如果类不可拷贝(如含 std::unique_ptr),后置++ 需显式定义为删除或用移动语义优化

重载运算符不是语法糖练习,每个重载都对应真实使用场景下的行为契约。最易被忽略的是 const 正确性、资源生命周期和异常边界——这些地方一出问题,往往表现为偶发崩溃或静默逻辑错误,而不是编译报错。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1550

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

236

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

806

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

542

2023.09.20

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

542

2023.09.20

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

4

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

2

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

50

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.3万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号