总结与测验:类、静态成员与友元

章节回顾

  • 在非静态成员函数内部,关键字 this 是一个指向当前隐式对象的 const 指针。
    可以让函数返回 *this 的引用,以实现方法链式调用,使多个成员函数可在同一表达式中对同一对象连续调用。

  • 建议将类定义放在与类同名的头文件(.h)中。
    简单成员函数(如访问函数、空体构造函数等)可直接在类内定义;
    非简单成员函数应放在与类同名的源文件(.cpp)中定义。

  • 在类体内定义的类型称为嵌套类型(或称成员类型)。
    类型别名(using/typedef)同样可以作为嵌套成员。

  • 类模板中:

    • 在类模板体内定义的成员函数可直接使用类模板的模板形参;
    • 在类模板体外定义的成员函数必须重新提供模板形参声明,并应紧接类模板定义之后、放在同一文件内。
  • 静态成员变量具有静态存储期,被类的所有对象共享;即使尚未实例化任何对象,它们依然存在。
    推荐通过“类名 + 作用域解析运算符 :: + 成员名”来访问。
    将静态成员声明为 inlineconstexpr 可在类内直接初始化。

  • 静态成员函数可在无对象的情况下调用,不含 this 指针,也无法访问非静态数据成员。

  • 在类体内使用 friend 关键字可将某个类或函数声明为友元
    友元(函数或类)被授予访问目标类所有 privateprotected 成员的权限。

    • 友元函数(成员或非成员)可像类成员一样访问类的受保护与私有成员。
    • 友元类可访问另一类的受保护与私有成员。

测验:随机怪物生成器

任务概述

本节将一步步实现一个“随机怪物生成器”。请按顺序完成以下小题。

问题 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*

(各小题解答略)

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"