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