浙江大学 25-26春夏 面向对象浙江大学 25-26春夏 面向对象Try Now! 开始模拟测试友元函数 (Friend Function):可以直观地把“类 (Class)”想象成一座房子,类中的私有成员private)就像是房子的私密区域(如卧室、保险箱)。正常情况下,只有住在这座房子里的家庭成员(即“类的成员函数”)才能进入这些私密区域。但是,如果你有一位非常信任的朋友,你在家里明确宣布“这是我的朋友”(通过 friend 关键字声明)。那么,即使这位朋友并不属于你的家庭(即“不是类的成员函数”),他依然有特权进入你的私密区域,直接访问你类中的 privateprotected 数据。内联函数 (Inline Function):使用 inline 关键字修饰的函数。在代码编译阶段,编译器会把函数调用的地方,直接用该函数的具体代码(函数体)替换掉,类似于宏展开。为什么适合“功能不复杂,但频繁调用”?频繁调用需要消除开销:普通的函数调用是有代价的(需要保存当前环境、参数入栈、跳转内存地址、执行后再跳回并恢复环境)。如果一个函数会被成千上万次地频繁调用,这种“调用开销”加起来就会非常大。内联相当于直接把代码抄过来,省去了所有的函数调用开销,让程序跑得更快。功能简单可以避免代码膨胀:如果一个函数内部代码非常多(比如几百行)还做内联,那么每个调用它的地方都会被塞入几百行代码。这会导致最终编译出的程序体积急剧变大(Code Bloat),反而可能拖慢运行速度(因为 CPU 的指令缓存装不下)。因此,内联函数通常只适合 1~5 行的简单代码(如属性的 getter/setter)。访问控制符 (public, protected, private) 的选择与使用private(私有,首选默认):用于隐藏内部实现细节保护数据。通常,所有的核心数据成员(变量)以及只在类内部使用的辅助函数,都应设为 private。它不仅防外人,也防子类,确保类的核心状态不被意外篡改。public(公开,对外接口):用于定义类能够提供的外部服务。只有那些你明确希望外部代码(如 main 函数或其他对象)直接调用的方法,才设为 publicprotected(保护,为继承而生)什么时候用? 当你设计一个准备被继承的父类(基类)时。为什么用? 有些方法或数据,你不想让外部的普通用户直接看到和滥用(所以不能用 public),但必须让它的“子类(派生类)”在扩展功能时能够使用(所以不能用 private 限制得太死)。经典场景:父类提供的一个底层通用计算方法,外部不应该直接调用它,但子类在实现自己特定的业务逻辑时,必须依赖这个方法来辅助计算。此时将该方法设为 protected 最为合适。静态成员 (Static Members) const 成员函数易错点静态成员函数没有 this 指针:静态成员(变量和函数)属于整个类,而不是属于某个具体的对象实例。因为它们不和具体对象绑定,所以静态成员函数内部根本不存在 this 指针(this 永远指向当前对象实例)。静态成员函数只能访问静态成员:由于没有 this 指针,静态成员函数无法知道要去操作哪个具体对象的数据。因此,它不能直接调用非静态成员函数,也不能直接访问非静态变量,只能操作其他静态成员。静态成员变量全类共享一份:无论创建了多少个该类的对象,静态成员变量在内存中永远只有唯一的一份,所有对象共享这一份数据。const 成员函数的兼容性const 成员函数相当于签了“保证不修改对象”的协议。普通对象(非 const,可读可写)完全可以调用 const 成员函数(因为只是要求只读,要求降低了,完全兼容);但反过来,const 对象(只读)绝对不能调用非 const 成员函数(因为有被修改的风险)。