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
成
员
函数(因
为
有被修改的
风险
)。