目录😋
任务描述
本关任务:声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。
相关知识
为了完成本关任务,你需要掌握:
- 类的声明和使用。
- 类的声明和对象的声明。
- 构造函数和析构函数的执行。
一、类的声明和使用
1. 类的声明基础
- 在 C++ 中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下:
class MyClass { public: int myVariable; void myFunction() { // 函数体,这里可以对数据成员进行操作 myVariable = 10; } };
- 在这个例子中,
MyClass
是类名,myVariable
是数据成员,myFunction
是成员函数。public
关键字表示这些成员可以在类的外部访问。2. 类的访问控制
- 除了
public
,还有private
和protected
访问控制符。private
成员只能在类的内部访问,protected
成员可以在类内部和派生类(继承关系中的子类)中访问。例如:
class MyClass { private: int privateVariable; protected: int protectedVariable; public: int publicVariable; void accessMembers() { privateVariable = 1; // 在类内部可以访问private成员 protectedVariable = 2; publicVariable = 3; } };
3. 类的使用
- 声明了类之后,可以通过创建对象来使用它。对象是类的一个实例,占用内存空间并存储类的数据成员的值。创建对象的语法如下:
MyClass object;
- 这里
object
是MyClass
类的一个对象。可以通过对象访问类的成员,如:
object.publicVariable = 5; object.myFunction();
二、类的声明和对象的声明
1. 类声明中的函数定义
- 成员函数可以在类内部定义,也可以在类外部定义。如果在类外部定义,需要使用作用域解析运算符
::
来指定函数所属的类。例如:
class MyClass { public: int myVariable; void myFunction(); }; void MyClass::myFunction() { myVariable = 20; }
2. 对象声明的多种方式
- 在栈上声明对象:这是最常见的方式,对象的内存由编译器自动分配和释放。例如:
MyClass stackObject;
- 在堆上声明对象:使用
new
关键字在堆上动态分配内存来创建对象。这种方式需要手动释放内存,使用delete
关键字。例如:
MyClass* heapObject = new MyClass; // 使用对象 delete heapObject;
- 对象数组声明:可以声明对象数组,例如:
MyClass arrayOfObjects[5];
三、构造函数和析构函数的执行过程
1. 构造函数
- 构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。构造函数的名称与类名相同,没有返回值类型(包括
void
)。例如:
class MyClass { public: int value; MyClass() { value = 0; } };
- 这是一个默认构造函数,当创建
MyClass
对象时,如果没有提供初始化参数,就会调用这个默认构造函数。也可以有带参数的构造函数,例如:
class MyClass { public: int value; MyClass(int initValue) { value = initValue; } };
- 构造函数的执行时机是在对象创建时。例如:
MyClass object1; // 调用默认构造函数 MyClass object2(5); // 调用带参数的构造函数,参数为5
2. 析构函数
- 析构函数是在对象销毁时自动调用的特殊成员函数,用于清理对象占用的资源。析构函数的名称是在类名前加
~
。例如:
class MyClass { public: int* dynamicArray; MyClass() { dynamicArray = new int[10]; } ~MyClass() { delete[] dynamicArray; } };
- 在这个例子中,构造函数中动态分配了一个整数数组,析构函数用于释放这个数组占用的内存。析构函数的执行时机是在对象生命周期结束时,比如对象所在的作用域结束(如果是栈对象)或者使用
delete
释放堆对象时。例如:
{ MyClass localObject; // 对象在这个作用域内有效 } // 作用域结束,localObject的析构函数被调用 MyClass* pointerObject = new MyClass; // 使用对象 delete pointerObject; // 调用析构函数
实验步骤
- 定义一个枚举类型 CPU_Rank,其形式为 enum CPU_Rank {P1 = 1, P2, P3, P4, P5, P6, P7},以此来表征 CPU 的不同等级。
- 声明 CPU 类,在类中设置等级(rank)、频率(frequency)、电压(voltage)等数据成员,并将它们设置为私有属性,以确保数据的封装性和安全性。
- 声明成员函数 run 和 stop,这两个函数的功能是输出相应的提示信息,从而直观地展示函数的执行情况。
- 在构造函数和析构函数中也添加输出提示信息的语句,以便清晰地观察对象的创建与销毁过程。
- 在主程序中创建一个 CPU 类的对象,并调用其成员函数,在此过程中仔细观察类对象的构造与析构的先后顺序,以及各个成员函数被调用时的具体情况,深入理解类与对象在 C++ 程序中的运行机制。
测试说明
根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。
预期输出:
构造了一个CPU! CPU开始运行! CPU停止运行! 析构了一个CPU!
通关代码
using namespace std; enum CPU_Rank {P1=1,P2,P3,P4,P5,P6,P7}; class CPU { private: CPU_Rank rank; int frequency; float voltage; public: CPU (CPU_Rank r, int f, float v) { /********** Begin **********/ rank = r; frequency = f; voltage = v; cout << "构造了一个CPU!"<<endl; /********** End **********/ } ~CPU () { /********** Begin **********/ cout<<"析构了一个CPU!"<<endl; /********** End **********/ } CPU_Rank GetRank() const { return rank; } int GetFrequency() const { return frequency; } float GetVoltage() const { return voltage; } void SetRank(CPU_Rank r) { rank = r; } void SetFrequency(int f) { frequency = f; } void SetVoltage(float v) { voltage = v; } void Run() { /********** Begin **********/ cout <<"CPU开始运行!"<<endl; /********** End **********/ } void Stop() { /********** Begin **********/ cout <<"CPU停止运行!"<<endl; /********** End **********/ } }; int main() { CPU a(P6,300,2.8); a.Run(); a.Stop(); }
测试结果