章节回顾
在非静态成员函数内部,关键字
this
是一个指向当前隐式对象的const
指针。
可以让函数返回*this
的引用,以实现方法链式调用,使多个成员函数可在同一表达式中对同一对象连续调用。建议将类定义放在与类同名的头文件(
.h
)中。
简单成员函数(如访问函数、空体构造函数等)可直接在类内定义;
非简单成员函数应放在与类同名的源文件(.cpp
)中定义。在类体内定义的类型称为嵌套类型(或称成员类型)。
类型别名(using
/typedef
)同样可以作为嵌套成员。类模板中:
- 在类模板体内定义的成员函数可直接使用类模板的模板形参;
- 在类模板体外定义的成员函数必须重新提供模板形参声明,并应紧接类模板定义之后、放在同一文件内。
静态成员变量具有静态存储期,被类的所有对象共享;即使尚未实例化任何对象,它们依然存在。
推荐通过“类名 + 作用域解析运算符::
+ 成员名”来访问。
将静态成员声明为inline
或constexpr
可在类内直接初始化。静态成员函数可在无对象的情况下调用,不含
this
指针,也无法访问非静态数据成员。在类体内使用
friend
关键字可将某个类或函数声明为友元。
友元(函数或类)被授予访问目标类所有private
与protected
成员的权限。- 友元函数(成员或非成员)可像类成员一样访问类的受保护与私有成员。
- 友元类可访问另一类的受保护与私有成员。
测验:随机怪物生成器
任务概述
本节将一步步实现一个“随机怪物生成器”。请按顺序完成以下小题。
问题 1-a
创建名为 MonsterType
的枚举类(scoped enumeration),列出以下怪物类型:Dragon
, Goblin
, Ogre
, Orc
, Skeleton
, Troll
, Vampire
, Zombie
,
并额外添加 maxMonsterTypes
以便计数。
问题 1-b
设计 Monster
类,包含 4 个数据成员:
- 类型
MonsterType
- 名称
std::string
- 咆哮
std::string
- 生命值
int
问题 1-c
将 MonsterType
设为 Monster
的嵌套非限定枚举(nested unscoped enum),并更名为 Type
。
问题 1-d
为 Monster
提供构造函数,允许一次性初始化所有成员变量。
以下代码需能编译:
int main()
{
Monster skeleton{ Monster::skeleton, "Bones", "*rattle*", 4 };
return 0;
}
问题 1-e
实现两个函数:
getTypeString()
:返回怪物类型的字符串描述。print()
:按下方示例格式输出怪物信息。
以下代码需能编译并输出:
int main()
{
Monster skeleton{ Monster::skeleton, "Bones", "*rattle*", 4 };
skeleton.print();
Monster vampire{ Monster::vampire, "Nibblez", "*hiss*", 0 };
vampire.print();
}
预期输出:
Bones the skeleton has 4 hit points and says *rattle*.
Nibblez the vampire is dead.
问题 1-f
创建命名空间 MonsterGenerator
,内含函数 generate()
,返回一个 Monster
。
暂时固定返回:
Monster{ Monster::skeleton, "Bones", "*rattle*", 4 }
以下代码需能编译并输出:
int main()
{
Monster m{ MonsterGenerator::generate() };
m.print();
}
预期输出:
Bones the skeleton has 4 hit points and says *rattle*
问题 1-g
向 MonsterGenerator
添加:
getName(int)
:参数 0–5,返回对应名称。getRoar(int)
:参数 0–5,返回对应咆哮。
并更新 generate()
以调用 getName(0)
与 getRoar(0)
。
输出示例(名称与咆哮可自定义):
Blarg the skeleton has 4 hit points and says *ROAR*
问题 1-h
使用全局随机数(Random.h)》中的 Random.h
,在 MonsterGenerator::generate()
中随机生成:
- 怪物类型(
Type
枚举范围内) - 名称(
getName(Random::get(0,5))
) - 咆哮(
getRoar(Random::get(0,5))
) - 生命值(
Random::get(1,100)
)
以下代码需能编译并输出类似:
Mort the zombie has 61 hit points and says *growl*
(各小题解答略)