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

C++访问控制与友元

核心原则:基于类而非对象。

1、c++的访问控制是类级别的,而不是对象级别的。

class MyClass { private: int secret; public: // ✅ 可以访问任何 MyClass 对象的私有成员 void accessOther(MyClass& other) { this->secret = 10; // 自己的 other.secret = 20; // 其他对象的 - 完全合法! } }; int main() { MyClass obj1, obj2; obj1.accessOther(obj2); // ✅ 编译通过 }

2、不同类之间的访问规则:不能访问,友元破例。

class ClassA { private: int data; }; class ClassB { private: int value; public: void tryAccess(ClassA& a) { a.data = 10; // ❌ 错误!ClassB 不能访问 ClassA 的私有成员 } };
class ClassA { private: int secret; // 声明 ClassB 为友元 friend class ClassB; }; class ClassB { public: void accessClassA(ClassA& a) { a.secret = 100; // ✅ 可以!因为是友元 } };

3、模板实例是不同的类型

template<typename T> class Box { private: T content; public: void show(const Box<T>& other) { // 不需要友元:Box<int> 访问 Box<int> - 同一个类型 this->content = other.content; // ✅ } // 问题:Box<int> 访问 Box<double> template<typename U> void copyFrom(const Box<U>& other) { // ❌ 错误!Box<int> 不能访问 Box<double> 的私有成员 this->content = other.content; } };

解决方案:模板友元

template<typename T> class Box { private: T content; // 关键:声明所有 Box<U> 都是友元 template<typename U> friend class Box; public: template<typename U> void copyFrom(const Box<U>& other) { // ✅ 现在可以了!友元声明让所有实例互通 this->content = other.content; } // 拷贝构造函数模板 template<typename U> Box(const Box<U>& other) : content(other.content) {} };

http://www.jsqmd.com/news/727760/

相关文章:

  • 如何一键下载30+平台文档?Kill-Doc免费工具完整指南
  • 在多轮长对话任务中观察Taotoken服务稳定性的实际案例
  • 从颜色代码到网络抓包:Hex编码的5个意想不到的实用场景
  • 终极窗口分辨率自定义工具SRWE:打破屏幕限制的完整指南
  • SK时科Shikues二三极管原厂原装一级代理分销经销
  • 在ubuntu上为claude code编程助手配置taotoken anthropic兼容通道
  • 腾讯AI协同者手把手教你学习CodeBuddyAI编辑器IDE使用与核心方法全网唯一
  • 02华夏之光永存・开源:黄大年茶思屋榜文解法「第24期 第2题」 基于自动控制闭环的网络自适应技术专项完整解法
  • P13157 [GCJ 2018 Finals] Swordmaster 题解
  • 2026年云南地州艺考美术生去哪里集训最好 - 云南美术头条
  • 官宣!2026 全球产品经理大会来袭:DeepSeek V4 之后,我们如何重构 AI 原生产品逻辑?
  • 赛芯微XB4302G, 单节锂离子/聚合物电池保护集成电路。
  • 利用 Taotoken 统一接口简化微服务架构中的 AI 能力集成
  • 内卷时代最好出路:往死里学网络安全,零基础小白自由跨行,漏洞挖掘副业增收
  • 写了个贪吃蛇
  • 一命二运三风水四积德五读书
  • VMware macOS解锁终极指南:如何免费在Windows和Linux上运行macOS虚拟机
  • DOTA数据集标签文件详解:手把手教你读懂旋转框坐标与难易度标注
  • 如何用AutoDock-Vina进行分子对接:新手完整指南
  • stp生成树协议
  • 华为 RH2288 V3 安装 Ubuntu 24.04 后黑屏:Tesla V100 与 simpledrm 冲突的绕开方案
  • 新手必看:用Mission Planner调APM/Pixhawk飞控,这20个参数不改飞机真不稳
  • 穿越机飞行控制革命:Betaflight 2025.12版本如何彻底解决抖动问题?
  • Unity 回合制多人游戏架构解析:从 Matchmaking 到定点物理
  • AI 幻觉与可信度:大模型的阿喀琉斯之踵
  • 智融SW3517S,支持 PD 的多快充协议双口充电解决方案。
  • 在aarch64机器上安装使用R语言的季节调整包
  • 从像素邻居到距离计算:手把手用NumPy实现图像中的欧式、街区与棋盘距离
  • D149 最小生成树 Boruvka 算法
  • 利用 Taotoken 多模型能力为智能客服场景提供备选方案