当前位置: 首页 > news >正文

【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】

目录😋

任务描述

相关知识

一、类的声明和使用

1. 类的声明基础

2. 类的访问控制

3. 类的使用

二、类的声明和对象的声明

1. 类声明中的函数定义

2. 对象声明的多种方式

三、构造函数和析构函数的执行过程

1. 构造函数

2. 析构函数

实验步骤

测试说明

通关代码

测试结果


任务描述

本关任务:声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。

相关知识

为了完成本关任务,你需要掌握:

  1. 类的声明和使用。
  2. 类的声明和对象的声明。
  3. 构造函数和析构函数的执行。

一、类的声明和使用

1. 类的声明基础
  • 在 C++ 中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下:
class MyClass {
public:int myVariable;void myFunction() {// 函数体,这里可以对数据成员进行操作myVariable = 10;}
};
  • 在这个例子中,MyClass是类名,myVariable是数据成员,myFunction是成员函数。public关键字表示这些成员可以在类的外部访问。
2. 类的访问控制
  • 除了public,还有privateprotected访问控制符。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;
  • 这里objectMyClass类的一个对象。可以通过对象访问类的成员,如:
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;  // 调用析构函数

实验步骤

  1. 定义一个枚举类型 CPU_Rank,其形式为 enum CPU_Rank {P1 = 1, P2, P3, P4, P5, P6, P7},以此来表征 CPU 的不同等级。
  2. 声明 CPU 类,在类中设置等级(rank)、频率(frequency)、电压(voltage)等数据成员,并将它们设置为私有属性,以确保数据的封装性和安全性。
  3. 声明成员函数 run 和 stop,这两个函数的功能是输出相应的提示信息,从而直观地展示函数的执行情况。
  4. 在构造函数和析构函数中也添加输出提示信息的语句,以便清晰地观察对象的创建与销毁过程。
  5. 在主程序中创建一个 CPU 类的对象,并调用其成员函数,在此过程中仔细观察类对象的构造与析构的先后顺序,以及各个成员函数被调用时的具体情况,深入理解类与对象在 C++ 程序中的运行机制。

测试说明

根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。

预期输出:

构造了一个CPU!
CPU开始运行!
CPU停止运行!
析构了一个CPU!

通关代码

#include <iostream>
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();
}

测试结果

在这里插入图片描述

http://www.lryc.cn/news/516892.html

相关文章:

  • 性能测试05|JMeter:分布式、报告、并发数计算、性能监控
  • 关于Java面试题大全网站无法访问的解决方案
  • CSS进阶和SASS
  • SwiftUI 撸码常见错误 2 例漫谈
  • JavaScript系列(9)-- Set数据结构专题
  • 开发培训-慧集通(iPaaS)集成平台脚本开发Groovy基础培训视频
  • 【软考网工笔记】计算机基础理论与安全——网络规划与设计
  • 【设计模式】 基本原则、设计模式分类
  • mac m2 安装 docker
  • Vue3-pinia的具体使用和刷新页面状态保持解决方案
  • 用ResNet50+Qwen2-VL-2B-Instruct+LoRA模仿Diffusion-VLA的论文思路,在3090显卡上训练和测试成功
  • 创建.net core 8.0项目时,有个启用原生AOT发布是什么意思
  • 2.1.7-1 io_uring的使用
  • 群论学习笔记
  • 深入解析-正则表达式
  • yolov5核查数据标注漏报和误报
  • 日志聚类算法 Drain 的实践与改良
  • 如何让用户在网页中填写PDF表格?
  • GXUOJ-算法-补题:22级《算法设计与分析》第一次课堂练习
  • 源代码编译安装X11及相关库、vim,配置vim(3)
  • uniapp 微信小程序 自定义日历组件
  • EdgeX规则引擎eKuiper
  • react 优化方案
  • 【Linux】sed编辑器
  • (leetcode算法题)137. 只出现一次的数字 II
  • 在大数据环境下高效运用NoSQL与关系型数据库的结合策略
  • C语言——分支与循环语句
  • 下载b站高清视频
  • 常见 JVM垃圾回收器、内存分配策略、JVM调优
  • 【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】