【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.pswp.cn/web/65309.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65309.shtml
英文地址,請注明出處:http://en.pswp.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資…

創建型模式4.原型模式

創建型模式 工廠方法模式&#xff08;Factory Method Pattern&#xff09;抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09;建造者模式&#xff08;Builder Pattern&#xff09;原型模式&#xff08;Prototype Pattern&#xff09;單例模式&#xff08;Singleto…

python學opencv|讀取圖像(二十七)使用time()繪制彈球動畫

【1】引言 前序已經學習了pythonopencv畫線段、圓形、矩形、多邊形和文字的相關操作&#xff0c;具體文章鏈接包括且不限于&#xff1a; python學opencv|讀取圖像&#xff08;十八&#xff09;使用cv2.line創造線段_cv2. 畫線段-CSDN博客 python學opencv|讀取圖像&#xff0…

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、開機有一些注冊表…

行為樹詳解(6)——黑板模式

【動作節點數據共享】 行為樹中需要的參數可以來自游戲中的各個模塊&#xff0c;如果僅需從多個模塊獲取少量參數&#xff0c;那么可以直接在代碼中調用其他模塊的單例繼而層層調用獲取數據。 如果獲取的參數量很大&#xff0c;從架構上看&#xff0c;我們需要通過加一個中間…

阿里云 人工智能與機器學習

阿里云的 人工智能&#xff08;AI&#xff09;與機器學習&#xff08;ML&#xff09; 服務為企業提供了全面的AI解決方案&#xff0c;幫助用戶在多個行業實現數據智能化&#xff0c;提升決策效率&#xff0c;推動業務創新。阿里云通過先進的技術和豐富的工具&#xff0c;支持用…

如果Adobe 退出中國后怎么辦

最近聽說Adobe要退出中國了?那咱們的設計師們可得好好想想怎么搞到正版軟件了。別急&#xff0c;今天教大家一個超酷的福利——Edu郵箱&#xff01; Edu郵箱是什么&#xff1f;有什么好處&#xff1f; Edu郵箱就是學校給學生和老師們發的郵箱&#xff0c;一般結尾是.edu。有了…

Structured-Streaming集成Kafka

一、上下文 《Structured-Streaming初識》博客中已經初步認識了Structured-Streaming&#xff0c;Kafka作為目前最流行的一個分布式的實時流消息系統&#xff0c;是眾多實時流處理框架的最優數據源之一。下面我們就跟著官方例子來看看Structured-Streaming是如何集成Kafka的&a…

Spring Boot 項目中集成 Kafka-03

在 Spring Boot 項目中集成 Kafka 有多種方式&#xff0c;適應不同的應用場景和需求。以下將詳細介紹幾種常用的集成方法&#xff0c;包括&#xff1a; 使用 Spring Kafka (KafkaTemplate 和 KafkaListener)使用 Spring Cloud Stream 與 Kafka Binder使用 Spring for Apache K…

生物醫學信號處理--緒論

前言 參考書籍&#xff1a;劉海龍&#xff0c;生物醫學信號處理&#xff0c;化學工業出版社 生物醫學信號分類 1、由生理過程自發或者誘發產生的電生理信號和非電生理信號 ? 電生理信號&#xff1a;ECG/心電、EEG/腦電、EMG/肌電、 EGG/胃電、 EOG/眼電 ? 非電生理信號&am…

unity 播放 序列幀圖片 動畫

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、方法一&#xff1a;代碼控制播放序列幀1、設置圖片屬性2、創建Image組件3、簡單的代碼控制4、掛載代碼并賦值 二、方法二&#xff1a;直接使用1.Image上添加…

QT c++ 自定義按鈕類 加載圖片 美化按鈕

如果你有需要利用圖片美化按鈕的情況&#xff0c;本文能幫助你。 鼠標左鍵按下按鈕和松開&#xff0c;按鈕顯示不同的圖片。 1.按鈕類 //因為此類比較簡單&#xff0c;1個頭文件搞定&#xff0c;沒有cpp文件 #ifndef CUSTOMBUTTON_H #define CUSTOMBUTTON_H #include <Q…

web漏洞之文件包含漏洞

一、文件包含漏洞 1、把DVWA頁面改為low級別&#xff0c;然后點擊File Inclusion頁面 文件包含漏洞有四種include()/require()/include_once()/require_once() 常見的文件包含漏洞代碼如下 <?php$file$_GET[filename]; filename隨意定義include($file); ?> -----…

小程序與物聯網(IoT)融合:開啟智能生活新篇章

一、引言 隨著移動互聯網技術的飛速發展&#xff0c;小程序作為一種輕量級的應用形式&#xff0c;憑借其無需下載安裝、即用即走的特點&#xff0c;迅速滲透到人們生活的各個領域。與此同時&#xff0c;物聯網&#xff08;IoT&#xff09;技術也在不斷進步&#xff0c;將各種物…

Ubuntu無法創建python venv環境

排查步驟如下 1. python3 -m venv venv he virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package using the following command.apt install python3.8-venvYou…

如何很快將文件轉換成另外一種編碼格式?編碼?按指定編碼格式編譯?如何檢測文件編碼格式?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;對于點云對應曲面…