当前位置: 首页 > news >正文

C/C++ 基础笔记(十二)友元、运算符重载

本篇核心知识:友元(友元函数、友元类)、运算符重载(规则、成员 / 全局重载、特殊运算符)、重载限制、前置 / 后置自增拓展


一、友元(friend)

概念

友元是 C++打破封装的机制,允许外部函数 / 类访问当前类的私有、保护成员,是单向、不可传递、不可继承的特殊关系。

特性

1. 友元函数
  • 定义:用friend声明的全局函数,不属于任何类。

  • 权限:可直接访问类的private/protected成员。

  • 特点:单向授权,不改变原函数属性,仅新增访问权限。

2. 友元类
  • 定义:用friend class 类名声明的类。

  • 权限:友元类的所有成员函数可访问当前类私有成员。

  • 特点:单向关系不可传递不可继承

3. 友元关系规则
  • 单向:A 友元 B,B 不一定友元 A。

  • 不可传递:A 友元 B、B 友元 C,A≠友元 C。

  • 不可继承:子类不继承父类的友元关系。

  • 声明位置:可放在任意权限区(public/private/protected),不影响权限。

代码示例

1. 友元函数
#include <iostream> using namespace std; ​ class Beta { private: int num; public: Beta(int n) : num(n) {} // 声明全局函数为友元 friend void up(Beta& b); }; ​ // 友元函数:访问私有成员 void up(Beta& b) { b.num *= 10; cout << b.num << endl; } ​ int main() { Beta b(5); up(b); // 输出50 return 0; }
2. 友元类
class XiaoShu { private: int n; public: XiaoShu(int x) : n(x) {} // 声明XiaoMei为友元类 friend class XiaoMei; }; ​ class XiaoMei { public: void show(XiaoShu& s) { cout << s.n << endl; // 访问私有成员 } };

相似概念比较:友元 vs 成员函数

  • 友元:外部授权,非类成员,单向访问。

  • 成员函数:类内置,默认访问私有成员,双向绑定。


二、运算符重载

概念

运算符重载是函数重载的特殊形式,为自定义类型赋予运算符新功能,语法不变、逻辑自定义。

特性

1. 重载核心规则(必考)
  • 不改变优先级、结合性、操作数个数

  • 不创造新运算符,仅扩展已有运算符功能。

  • 不改变原有语义(如 + 不做减法)。

  • 不能重载:..*::?:sizeof

  • 重载形式:成员函数全局函数(常配合友元)

2. 成员函数重载
  • 格式:返回值 operator运算符(参数)

  • 特点:隐含 this 指针,第一个操作数为当前对象。

  • 适用:双目运算符(+、-、*)、单目运算符、下标[]、函数调用()、箭头->

3. 全局函数重载
  • 格式:返回值 operator运算符(参数1, 参数2)

  • 特点:无 this 指针,需显式传所有操作数,常声明为友元访问私有成员。

  • 适用:流运算符<</>>、单目运算符、对称双目运算符。

代码示例

1. 复数加法重载(成员函数)
#include <iostream> using namespace std; ​ class Complex { private: double real; // 实部 double imag; // 虚部 public: Complex(double r = 0, double i = 0) : real(r), imag(i) {} // 成员函数重载+ Complex operator+(const Complex& other) const { return Complex(real + other.real, imag + other.imag); } void show() const { cout << real << "+" << imag << "i" << endl; } }; ​ int main() { Complex c1(3,4), c2(1,2); Complex c3 = c1 + c2; // 调用重载+ c3.show(); // 输出4+6i return 0; }
2. 流运算符重载(全局 + 友元)
class Complex { private: double real, imag; public: Complex(double r=0, double i=0) : real(r), imag(i) {} // 声明全局函数为友元 friend ostream& operator<<(ostream& os, const Complex& c); }; ​ // 全局重载<< ostream& operator<<(ostream& os, const Complex& c) { os << c.real << "+" << c.imag << "i"; return os; } ​ int main() { Complex c(2,3); cout << c << endl; // 输出2+3i return 0; }

三、特殊运算符重载要求

1. 必须成员函数重载
  • 下标[]、函数调用()、箭头->、赋值=

  • 原因:需通过 this 指针访问对象状态,全局无 this。

2. 必须全局函数重载
  • 流运算符<</>>、类型转换运算符。

  • 原因:左操作数为流对象(非自定义类型),无法作为 this。

3. 赋值运算符(=)
  • 必须成员重载,避免浅拷贝导致内存泄漏。

  • 默认赋值:逐字节浅拷贝,含指针时需手动深拷贝。

四、前置 / 后置自增重载(拓展)

  • 前置++x先增后用,无额外参数,返回引用。

  • 后置x++先用后增,需加int占位参数,返回值。

代码示例

class Num { private: int val; public: Num(int v) : val(v) {} // 前置++ Num& operator++() { val++; return *this; } // 后置++(int占位) Num operator++(int) { Num temp = *this; val++; return temp; } };

拓展:重载 new/delete

  • 禁止重载全局new/delete,仅重载类专属版本。

  • 重载中不可直接调用 new/delete,避免递归,改用malloc/free

http://www.rkmt.cn/news/1492771.html

相关文章:

  • 中望3D悟空2027横空出世,即刻申领试用名额!
  • Python 爬虫项目 Selenium 显式等待、iframe 嵌套与弹窗处理实战
  • VS2010 x64平台下可直接编译运行的DLL封装工程(含头文件、lib导入库与调用示例)
  • 显卡驱动彻底卸载终极指南:DDU工具完整解决方案
  • 腕式血压计方案开发设计,腕式血压计MCU控制芯片选择
  • Windows微信PC版本地数据库密钥提取工具(C#开源命令行版)
  • Android Studio中文界面终极指南:3步轻松告别英文开发障碍
  • 多模态微调技术:突破模态鸿沟的实践指南
  • Linux命令11
  • 别再乱铺地了!从《电磁兼容工程》读书笔记看,高速PCB设计里地栅格和完整地平面到底怎么选?
  • Python+OpenCV多目标跟踪实战:鼠标框选目标、KCF算法实时跟踪、含完整实验文档与测试视频
  • 嵌入式硬件时序参数详解:从建立保持时间到i.MX RT1024接口配置
  • RK3588 Android12开发避坑指南:如何高效同步官方更新并管理自定义分支(附Repo实战)
  • 数据标签是什么?一文说清区别数据标签和数据分类的区别
  • 终极免费开源工具:GTA5线上小助手完整使用指南
  • 南宁法穆兰+卡地亚手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • Keyviz实用指南:高效掌握实时键鼠可视化必备神器
  • STM32F030C8T6一站式配齐丨粤科源兴STM32分销商,同系列F0/F1/F4均可配套
  • Diablo Edit2开源技术深度解析:构建企业级暗黑2存档编辑解决方案
  • 第72篇 | HarmonyOS 分享降级:近场能力不可用时回到系统分享
  • FastbootEnhance:3倍效率提升的Android设备终极管理解决方案
  • HCS12嵌入式内核升级:从M68HC11到高效指令集与寻址模式解析
  • 大模型伦理使用实操指南:从提问到交付的七步校验法
  • 跟我一起学“计算机网络”通识-网络概述
  • 2026年6月最新版盐城第三方CMACNAS甲醛检测治理口碑名单:万清CMA检测中心等5家深度测评 - 一休咨询
  • 遗传算法三大算子深度解析:选择、交叉、变异的工程调优逻辑
  • D48: 性能与信息保护的平衡实践
  • 有哪些高效的NOI省选专题题目解题技巧
  • 京华ALTDH382SS PCIe转RS232串口卡原厂驱动包(Win7/Win10双系统支持)
  • 太阳能领域情感分析实战:NLP舆情监测轻量级方案