【开发界人文十问】二、类的private私有,到底是对谁私有?为何修改器能随意修改?
文章目录一、先破误区private 从来不是“安全加密”二、private 到底是“对谁私有”它限制这些它完全管不了这些三、为什么修改器可以随便改私有变量四、一张表看懂 private 的真实边界五、回到人文思考private 的本质是什么六、总结在 C 乃至绝大多数面向对象语言里private都是我们最熟悉的关键字之一。我们从小被教育私有成员外部不能访问这是封装是安全是规范。于是一个细思极恐的问题就来了既然是“私有”是“不可访问”为什么游戏修改器、内存工具、随便一个指针偏移就能轻松改掉类里的私有变量这个“私有”到底是在防谁又对谁失效这同样是一道接近哲学的边界题今天我们把它彻底讲透。一、先破误区private 从来不是“安全加密”很多人对private有一个根深蒂固的误解加上 private数据就被保护起来了别人改不了。完全错了。private不具备任何内存保护数据加密权限隔离反篡改能力它甚至不生成任何运行时指令。编译完成后public / private / protected这些访问控制关键字在二进制里就消失了。CPU 不知道什么叫私有内存不知道什么叫封装。它们只认地址、偏移、长度。二、private 到底是“对谁私有”一句话说死private 是对【编译器】和【程序员】私有不是对【运行时】和【内存】私有。更精确一点private 只限制类外部的代码直接访问这个成员名。它管的是“语法”不管“数据”。它限制这些类外直接写obj.private_var→ 编译报错防止你不小心依赖类的内部实现防止团队其他人乱改内部状态导致逻辑崩溃强制你通过成员函数访问维护类的不变量它完全管不了这些指针强行偏移内存读写汇编直接读写地址修改器、CE、外挂同一类的其他对象互相访问私有友元函数 / 友元类三、为什么修改器可以随便改私有变量举个最简单的例子classPlayer{private:inthp100;// 私有intmp20;// 私有};intmain(){Player p;// p.hp 9999; // 报错编译器不让}在内存里对象p布局大概是p → 对象起始地址 p 0 → hp p 4 → mp修改器做的事情非常简单找到Player对象的地址直接向偏移 0 的位置写入一个数值全程不经过 C 语法编译器不在场private 形同虚设。这就是为什么你代码里写死 private游戏里照样能锁血、改金币、改等级private 防的是误操作不防外挂。四、一张表看懂 private 的真实边界访问方式是否能修改 private原因类外直接.访问否编译器语法检查同类其他对象访问是C 允许同一类互访私有友元函数/类是友元打破访问控制指针偏移绕过是直接操作内存无视关键字修改器/内存工具是直接读写进程地址空间汇编指令是只认地址不认权限你会发现只要不通过“变量名”去访问private 就毫无约束力。五、回到人文思考private 的本质是什么如果放进【开发界人文十问】它的哲学总结是private 是一道道德约束不是一道物理锁。它限制的是人的代码规范不限制机器的底层行为。编译期讲规矩运行期全透明。它的设计初衷是为了更好的模块化更清晰的接口更少的意外错误更可维护的大型项目不是为了安全不是为了防盗不是为了防修改。六、总结类的 private 私有是对“类外代码名”私有不是对内存私有。它只在编译期生效只约束语法不约束数据。所以你写代码时它严格保护上内存工具它瞬间透明想防篡改private 毫无意义想做封装private 极其有用这就是面向对象最容易被误解、却又最本质的真相。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2507239.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!