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

目录😋

任务描述

相关知识

一、不同访问属性成员的访问方式

 1. public成员

 2. private成员

 3. protected成员

二、观察构造函数和析构函数的执行过程

1. 构造函数

2. 析构函数

三、学习类的组合使用方法

1. 类的组合概念

2. 实现示例

实验步骤

测试说明

通关代码

测试结果


任务描述

本关任务:声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。


相关知识

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

  1. 不同访问属性的成员的访问方式
  2. 构造函数和析构函数的执行过程
  3. 类的组合使用方法

一、不同访问属性成员的访问方式

访问控制符:在 C++ 中,类的成员(包括数据成员和成员函数)可以有三种访问控制符:public(公共的)、private(私有的)和protected(受保护的)。

 1.public成员

可以在类的外部直接访问。例如:

class MyClass {
public:int publicVariable;void publicFunction() {// 函数体}
};
int main() {MyClass obj;obj.publicVariable = 10;  // 直接访问public数据成员obj.publicFunction();     // 直接调用public成员函数return 0;
}
 2.private成员

只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。例如:

class MyClass {
private:int privateVariable;
public:void setPrivateVariable(int value) {privateVariable = value;  // 在类内部访问private数据成员}int getPrivateVariable() {return privateVariable;   // 在类内部访问private数据成员}
};
int main() {MyClass obj;// obj.privateVariable = 20;  // 错误,不能在类外部直接访问private成员obj.setPrivateVariable(20);   // 通过public成员函数来间接访问和修改private成员int value = obj.getPrivateVariable();return 0;
}
 3.protected成员

它类似于private成员,在类的外部不能直接访问。但是,protected成员可以在派生类(继承该类的子类)中访问。例如:

class BaseClass {
protected:int protectedVariable;
public:void setProtectedVariable(int value) {protectedVariable = value;}
};
class DerivedClass : public BaseClass {
public:void modifyProtectedVariable() {protectedVariable += 10;  // 在派生类中访问基类的protected成员}
};
int main() {DerivedClass obj;// obj.protectedVariable = 30;  // 错误,不能在类外部直接访问protected成员obj.setProtectedVariable(30);obj.modifyProtectedVariable();return 0;
}

二、观察构造函数和析构函数的执行过程

1. 构造函数
  • 定义和作用:构造函数是一种特殊的成员函数,它的名字与类名相同,没有返回值类型(包括void)。它主要用于初始化类的对象。例如:
    class MyClass {
    public:int value;MyClass() {value = 0;  // 初始化数据成员}
    };
    
  • 执行时机:当创建一个对象时,构造函数会自动被调用。例如:
    int main() {MyClass obj;  // 调用MyClass的默认构造函数return 0;
    }
    
  • 重载构造函数:可以有多个构造函数,它们的参数列表不同,这称为构造函数的重载。例如:
    class MyClass {
    public:int value;MyClass() {value = 0;}MyClass(int initValue) {value = initValue;}
    };
    int main() {MyClass obj1;      // 调用默认构造函数MyClass obj2(10);  // 调用带参数的构造函数return 0;
    }
    
2. 析构函数
  • 定义和作用:析构函数也是一种特殊的成员函数,它的名字是在类名前面加上~符号,没有参数和返回值类型。它主要用于在对象销毁时释放资源,如动态分配的内存、打开的文件等。例如:
    class MyClass {
    public:int* dynamicArray;MyClass() {dynamicArray = new int[10];}~MyClass() {delete[] dynamicArray;  // 释放动态分配的内存}
    };
    
  • 执行时机:析构函数在对象的生命周期结束时自动被调用。如果对象是在栈上创建的,那么当对象所在的作用域结束时,析构函数就会被调用;如果对象是在堆上创建的(使用new创建),那么当使用delete删除对象时,析构函数会被调用。例如:
    int main() {MyClass obj1;  // 在栈上创建对象,作用域结束时析构函数被调用MyClass* obj2 = new MyClass;// 使用obj2delete obj2;    // 使用delete时析构函数被调用return 0;
    }

三、学习类的组合使用方法

1. 类的组合概念
  • 类的组合是指一个类的对象作为另一个类的数据成员。通过这种方式,可以将复杂的问题分解为多个简单的类来实现,从而提高代码的可维护性和复用性。例如,假设有一个Engine类表示汽车发动机,和一个Car类,Car类中包含一个Engine对象作为其数据成员来表示汽车有一个发动机。
2. 实现示例
  • 首先定义Engine类:
    class Engine {
    public:void start() {// 启动发动机的代码std::cout << "Engine started." << std::endl;}void stop() {// 停止发动机的代码std::cout << "Engine stopped." << std::endl;}
    };
    
  • 然后定义Car类,其中包含Engine对象:
    class Car {
    private:Engine engine;
    public:void drive() {engine.start();// 汽车行驶的代码std::cout << "Car is driving." << std::endl;}void park() {// 汽车停车的代码engine.stop();}
    };
    
  • main函数中使用:
    int main() {Car myCar;myCar.drive();myCar.park();return 0;
    }
    
  • 在这个例子中,Car类组合了Engine类,Car类的对象myCar可以通过其内部的Engine对象engine来调用Engine类的成员函数startstop,从而实现汽车的行驶和停车功能。

实验步骤

参考实验指导书第四章的实验步骤 4:

  1. 声明CPU类(可使用第二题中的CPU类)、RAM类、CDROM类。
  2. 声明Computer类:声明私有数据成员cpu、ram、cdrom,声明公有成员函数run、stop,可在其中输出提示信息。
  3. 在主程序中声明一个Computer的对象,调用其成员函数,观察类对象及其成员变量的构造与析构顺序,以及成员函数的调用。

测试说明

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

预期输出:

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

通关代码

#include <iostream>
using namespace std;class CPU
{
public:CPU (){}~CPU () {}void Run() {cout << "CPU开始运行!" << endl; }void Stop() {cout << "CPU停止运行!" << endl; }
};class RAM
{
public:RAM () {}~RAM () {}void Run() {cout << "RAM开始运行!" << endl; }void Stop() {cout << "RAM停止运行!" << endl; }
};class CDROM
{
public:CDROM () {}~CDROM () {}void Run() {cout << "CDROM开始运行!" << endl; }void Stop() {cout << "CDROM停止运行!" << endl; }
};class Computer
{
private:CPU cpu;RAM ram;CDROM cdrom;
public:Computer (CPU c, RAM r, CDROM cd){cpu = c;ram = r;cdrom = cd;cout << "构造了一个Computer!" << endl;}~Computer () {cout << "析构了一个Computer!"; }CPU GetCPU() const { return cpu; }RAM GetRAM() const { return ram; }CDROM GetCDROM() const {return cdrom; }void setCPU(CPU c) { cpu = c; }void setRAM(RAM r) { ram = r; }void setCDROM(CDROM cd) { cdrom = cd; }void Run() {cout << "Computer开始运行!" << endl;/********** Begin **********/cpu.Run();ram.Run();cdrom.Run();/********** End **********/}void Stop () {cout << "Computer停止运行!" << endl;/********** Begin **********/cpu.Stop();ram.Stop();cdrom.Stop();/********** End **********/}
};int main() {CPU c;RAM r;CDROM cd;Computer computer(c, r, cd);computer.Run();computer.Stop();
}

测试结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xilinx的高速接口构成原理和连接结构及ibert工具的使用-以k7 GTX为例

一、相关简介 Xilinx的高速接口称之为transceivers(高速收发器&#xff09;&#xff0c;这部分的电路是专用电路&#xff0c;供电等都是独立的&#xff0c;根据速率可以分为GTP/GTX/GTH/GTY/GTM等。 Xilinx的高速接口是QUAD为单位的&#xff0c;没一个QUAD由一个时钟COMMON资…

rabbitmq——岁月云实战笔记

1 rabbitmq设计 生产者并不是直接将消息投递到queue&#xff0c;而是发送给exchange&#xff0c;由exchange根据type的规则来选定投递的queue&#xff0c;这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage&#xff0c;而实际我们却应该使用自己…

2.系统学习-逻辑回归

逻辑回归 前言最大似然估计概率似然函数(likelihood function)最大似然估计 逻辑回归逻辑回归的似然函数与梯度 分类问题常用评价指标项目案例拓展内容作业 前言 逻辑回归与线性回归均属于广义线性模型&#xff0c;区别在于线性回归用于解决回归问题&#xff0c;例如身高、销量…

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新&#xff0c;就想着更新看看&#xff08;能否冲掉问题&#xff09;4、更新没成功&#xff0c;自动重启电脑5、风险文件&#xff08;好家伙命名还挺规范&#xff0c;一看名字就知道出问题了&#xff09;6、开机有一些注册表…

阿里云 人工智能与机器学习

阿里云的 人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09; 服务为企业提供了全面的AI解决方案&#xff0c;帮助用户在多个行业实现数据智能化&#xff0c;提升决策效率&#xff0c;推动业务创新。阿里云通过先进的技术和丰富的工具&#xff0c;支持用…

Structured-Streaming集成Kafka

一、上下文 《Structured-Streaming初识》博客中已经初步认识了Structured-Streaming&#xff0c;Kafka作为目前最流行的一个分布式的实时流消息系统&#xff0c;是众多实时流处理框架的最优数据源之一。下面我们就跟着官方例子来看看Structured-Streaming是如何集成Kafka的&a…

生物医学信号处理--绪论

前言 参考书籍&#xff1a;刘海龙&#xff0c;生物医学信号处理&#xff0c;化学工业出版社 生物医学信号分类 1、由生理过程自发或者诱发产生的电生理信号和非电生理信号 • 电生理信号&#xff1a;ECG/心电、EEG/脑电、EMG/肌电、 EGG/胃电、 EOG/眼电 • 非电生理信号&am…

unity 播放 序列帧图片 动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、方法一&#xff1a;代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二&#xff1a;直接使用1.Image上添加…

小程序与物联网(IoT)融合:开启智能生活新篇章

一、引言 随着移动互联网技术的飞速发展&#xff0c;小程序作为一种轻量级的应用形式&#xff0c;凭借其无需下载安装、即用即走的特点&#xff0c;迅速渗透到人们生活的各个领域。与此同时&#xff0c;物联网&#xff08;IoT&#xff09;技术也在不断进步&#xff0c;将各种物…

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能&#xff0c;选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其&#xff0c;在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换&#xff0c;特别方便。VS文件另…

PCL点云库入门——PCL库点云特征之PFH点特征直方图(Point Feature Histograms -PHF)

1、算法原理 PFH点&#xff08;Point Feature Histogram&#xff09;特征直方图的原理涉及利用参数化查询点与邻域点之间的空间差异&#xff0c;并构建一个多维直方图以捕捉点的k邻域几何属性。这个高维超空间为特征表示提供了一个可度量的信息空间&#xff0c;对于点云对应曲面…

5. CSS引入方式

5.1 CSS的三种样式 按照 CSS 样式书写的位置(或者引入的方式)&#xff0c;CSS样式表可以分为三大类&#xff1a; 1.行内样式表&#xff08;行内式&#xff09; 2.内部样式表&#xff08;嵌入式&#xff09; 3. 外部样式表&#xff08;链接式&#xff09; 5.2 内部样式表 …

为什么ip属地一会河南一会江苏

在使用互联网的过程中&#xff0c;许多用户可能会遇到这样一个问题&#xff1a;自己的IP属地一会儿显示为河南&#xff0c;一会儿又变成了江苏。这种现象可能会让人感到困惑&#xff0c;甚至产生疑虑&#xff0c;担心自己的网络活动是否受到了某种影响。为了解答这一疑问&#…

jmeter性能测试例子

目录 一、介绍 二、操作例子 设置线程数 添加同步定时器 添加聚合报告 一、介绍 在软件测试中&#xff0c;一般用jmeter来对接口做性能测试&#xff0c;对对接口进行一个压力的测试。 简述&#xff1a; 在接口的线程中设置线程的数量和时间&#xff0c;添加一个定时器…

PDFelement 特别版

Wondershare PDFelement Pro 是一款非常强大的PDF编辑软件&#xff0c;它允许用户轻松地编辑、转换、创建和管理PDF文件。这个中文特别版的软件具有许多令人印象深刻的功能&#xff0c;PDFelement Pro 提供了丰富的编辑功能&#xff0c;可以帮助用户直接在PDF文件中添加、删除、…

【OpenCV】使用Python和OpenCV实现火焰检测

1、 项目源码和结构&#xff08;转&#xff09; https://github.com/mushfiq1998/fire-detection-python-opencv 2、 运行环境 # 安装playsound&#xff1a;用于播放报警声音 pip install playsound # 安装opencv-python&#xff1a;cv2用于图像和视频处理&#xff0c;特别是…

深入理解Mybatis原理》MyBatis的sqlSessi

sqlSessionFactory 与 SqlSession 正如其名&#xff0c;Sqlsession对应着一次数据库会话。由于数据库会话不是永久的&#xff0c;因此Sqlsession的生命周期也不应该是永久的&#xff0c;相反&#xff0c;在你每次访问数据库时都需要创建它&#xff08;当然并不是说在Sqlsession…

《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

随着HarmonyOS NEXT发布&#xff0c;鸿蒙生态日益壮大&#xff0c;广大开发者对于系统化学习平台和课程的需求愈发强烈。近日&#xff0c;华为精心打造的《HarmonyOS第一课》全新上线&#xff0c;集“学、练、考”于一体&#xff0c;凭借多维融合的教学模式与系统课程设置&…

springboot集成整合工作流,activiti审批流,整合实际案例,流程图设计,流程自定义,表单配置自定义,代码demo流程

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…