c++總復習

  1. C++ 中多態性在實際項目中的應用場景
    • 圖形繪制系統
      • 描述:在一個圖形繪制軟件中,可能有多種圖形,如圓形、矩形、三角形等。這些圖形都有一個共同的操作,比如繪制(draw)。通過多態性,可以定義一個基類Shape,其中有一個純虛函數draw。然后,CircleRectangleTriangle等派生類分別實現自己的draw函數。
      • 代碼示例
class Shape {
public:virtual void draw() = 0;
};
class Circle : public Shape {
public:void draw() override {// 繪制圓形的具體代碼std::cout << "Drawing a circle." << std::endl;}
};
class Rectangle : public Shape {
public:void draw() override {// 繪制矩形的具體代碼std::cout << "Drawing a rectangle." << std::endl;}
};
  • 優勢:當需要繪制一系列圖形時,可以將這些圖形對象存儲在一個Shape指針數組中。然后通過遍歷數組,調用每個對象的draw函數,而不需要為每種圖形單獨編寫繪制代碼。這樣可以使代碼結構更加清晰,易于維護和擴展。如果要添加新的圖形,只需要創建一個新的派生類并實現draw函數即可。
  • 設備驅動程序開發
    • 描述:在操作系統的設備驅動開發中,不同的設備(如打印機、掃描儀、硬盤等)有不同的操作方式。可以定義一個基類Device,其中有虛函數如openclosereadwrite等。不同設備的驅動程序類(如PrinterScannerHardDisk)作為派生類,根據設備的具體特性實現這些虛函數。
    • 代碼示例(簡化)
class Device {
public:virtual bool open() = 0;virtual bool close() = 0;virtual size_t read(char* buffer, size_t size) = 0;virtual size_t write(const char* data, size_t size) = 0;
};
class Printer : public Device {
public:bool open() override {// 打開打印機的具體代碼return true;}bool close() override {// 關閉打印機的具體代碼return true;}size_t read(char* buffer, size_t size) override {// 打印機一般不進行讀取操作,返回0return 0;}size_t write(const char* data, size_t size) override {// 打印數據的具體代碼return size;}
};
  • 優勢:操作系統可以使用統一的接口來處理不同的設備。例如,在一個文件讀寫操作的函數中,它可以接收一個Device指針。根據實際傳入的是打印機、掃描儀還是硬盤的對象指針,會調用相應設備的readwrite函數。這使得操作系統的設備管理模塊能夠以一種通用的方式與各種設備進行交互,提高了代碼的復用性和可維護性。
  • 游戲開發中的角色行為
    • 描述:在游戲中,不同的角色有不同的行為。例如,戰士、法師、刺客等角色都有攻擊(attack)行為,但他們的攻擊方式不同。可以定義一個基類Character,其中有一個虛函數attack。每個角色類(如WarriorMageAssassin)作為派生類,實現自己的attack函數。
    • 代碼示例(簡化)
class Character {
public:virtual void attack() = 0;
};
class Warrior : public Character {
public:void attack() override {// 戰士攻擊的具體代碼,可能是近身物理攻擊std::cout << "Warrior attacks with a sword." << std::endl;}
};
class Mage : public Character {
public:void attack() override {// 法師攻擊的具體代碼,可能是釋放魔法std::cout << "Mage casts a spell." << std::endl;}
};
  • 優勢:游戲中的戰斗場景可以通過一個Character指針數組來管理角色。在戰斗循環中,遍歷數組并調用每個角色的attack函數,實現不同角色的攻擊行為。這樣可以方便地添加新的角色類型,并且在游戲邏輯處理上更加靈活,代碼的組織結構也更加合理。

  1. C++ 中面向對象編程實現數據隱藏的方法
    • 使用類的訪問限定符(private、protected、public)
      • 描述:在 C++ 中,private訪問限定符用于限制類的成員(數據成員和成員函數)只能在類的內部訪問。例如,定義一個Person類,其中有一個age數據成員,將其設為private,外部代碼就不能直接訪問這個成員。
      • 代碼示例
class Person {
private:int age;
public:void setAge(int a) {if (a > 0) {age = a;}}int getAge() {return age;}
};
  • 原理:通過將age設為private,只能通過類提供的setAgegetAge函數來間接訪問和修改age的值。這樣可以在setAge函數中添加數據驗證邏輯,保證age的值符合一定的規則(如年齡不能為負數)。外部代碼無法繞過這些函數直接操作age,從而實現了數據隱藏和封裝。
  • 使用友元函數和友元類(謹慎使用)
    • 描述:友元函數和友元類可以訪問類的privateprotected成員。雖然這看起來好像破壞了數據隱藏,但在某些特定情況下是有用的。例如,定義一個Date類和一個DateUtil類,DateUtil類中的某些函數可能需要直接訪問Date類的內部成員來進行日期計算等操作。
    • 代碼示例
class Date {
private:int year;int month;int day;friend class DateUtil;
};
class DateUtil {
public:bool isLeapYear(const Date& d) {// 直接訪問Date類的year成員進行判斷if ((d.year % 4 == 0 && d.year % 100!= 0) || (d.year % 400 == 0)) {return true;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62899.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62899.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62899.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pip離線安裝一個github倉庫

要使用pip安裝一個本地Git倉庫&#xff0c;你可以按照以下步驟操作&#xff1a; 確保你已經克隆了Git倉庫到本地。 進入倉庫所在的目錄。 使用pip安裝。 以下是具體的命令&#xff1a; 克隆Git倉庫到本地&#xff08;替換下面的URL為你的倉庫URL&#xff09; git clone https…

【從零開始入門unity游戲開發之——C#篇04】棧(Stack)和堆(Heap),值類型和引用類型,以及特殊的引用類型string

文章目錄 知識回顧一、棧&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是棧和堆2、為什么要分棧和堆3、棧和堆的區別棧堆 4、總結 二、值類型和引用類型1、那么值類型和引用類型到底有什么區別呢&#xff1f;值類型引用類型 2、總結 三、特殊的引用類…

【C語言實現:用隊列模擬棧與用棧模擬隊列(LeetCode 225 232)】

LeetCode刷題記錄 &#x1f310; 我的博客主頁&#xff1a;iiiiiankor&#x1f3af; 如果你覺得我的內容對你有幫助&#xff0c;不妨點個贊&#x1f44d;、留個評論?&#xff0c;或者收藏?&#xff0c;讓我們一起進步&#xff01;&#x1f4dd; 專欄系列&#xff1a;LeetCode…

【Python】Selenium 爬蟲的使用技巧和案例

引言 Selenium 是 Python 中功能強大的自動化測試工具,因其能夠操控瀏覽器進行模擬操作,被廣泛應用于網頁數據爬取。相比傳統的 requests 等庫,Selenium 能更好地應對動態加載內容和復雜交互場景。本文將詳細介紹 Selenium 爬蟲的使用技巧,并提供實際案例來幫助讀者快速上…

MySQL SQL語句性能優化

MySQL SQL語句性能優化指南 一、查詢設計優化1. 避免 SELECT *2. 使用 WHERE 進行條件過濾3. 避免在索引列上使用函數和表達式4. 使用 LIMIT 限制返回行數5. 避免使用子查詢6. 優化 JOIN 操作7. 避免全表掃描 二、索引優化1. 使用合適的索引2. 覆蓋索引3. 索引選擇性4. 多列索引…

Mybatis動態sql執行過程

動態SQL的執行原理主要涉及到在運行時根據條件動態地生成SQL語句&#xff0c;然后將其發送給數據庫執行。以下是動態SQL執行原理的詳細解釋&#xff1a; 一、接收參數 動態SQL首先會根據用戶的輸入或系統的條件接收參數。這些參數可以是查詢條件、更新數據等&#xff0c;它們…

java jar包加密 jar-protect

介紹 java 本身是開放性極強的語言,代碼也容易被反編譯,沒有語言層面的一些常規保護機制,jar包很容易被反編譯和破解。 受classfinal&#xff08;已停止維護&#xff09;設計啟發,針對springboot日常項目開發,重新編寫安全可靠的jar包加殼加密技術,用于保護軟件版權。 使用說…

Linux:Git

Git常見指令&#xff1a; git help xx_command git xx_command --help git --version 查看git版本git config --global user.name "xxx_name" 全局級別的簽名設置&#xff0c;全局的放在本用 git config --global user.ema…

【WiFi】WiFi中RSSI、SNR、NF之間關系及說明

RSSI&#xff08;接收信號強度指示&#xff09; 定義&#xff1a; RSSI 是一個相對值&#xff0c;用于表示接收到的無線信號的強度。它通常由無線設備的硬件&#xff08;如無線網卡或無線芯片&#xff09;直接提供。 計算&#xff1a; RSSI 的計算通常是由設備的無線芯片完成的…

提升音頻轉錄準確性:VAD技術的應用與挑戰

引言 在音頻轉錄技術飛速發展的今天&#xff0c;我們面臨著一個普遍問題&#xff1a;在嘈雜環境中&#xff0c;轉錄系統常常將非人聲誤識別為人聲&#xff0c;導致轉錄結果出現錯誤。例如&#xff0c;在whisper模式下&#xff0c;系統可能會錯誤地轉錄出“謝謝大家”。本文將探…

[ZMQ] -- ZMQ通信Protobuf數據結構 1

1、前言背景 工作需要域間實現zmq通信&#xff0c;剛開始需要比較簡單的數據結構&#xff0c;比如兩個bool&#xff0c;后面可能就需要傳輸比較大的數據&#xff0c;所以記錄下實現流程&#xff0c;至于為啥選擇proto數據結構去做大數據傳輸&#xff0c;可能是地平線也用這個&…

順序表的使用,對數據的增刪改查

主函數&#xff1a; 3.c #include "3.h"//頭文件調用 SqlListptr sql_cerate()//創建順序表函數 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆區申請連續的空間if(NULLptr){printf("創建失敗\n");return NULL;//如果沒有申請成功&#xff…

React和Vue中暴露子組件的屬性和方法給父組件用,并且控制子組件暴露的顆粒度的做法

React 在 React 中&#xff0c;forwardRef 是一種高級技術&#xff0c;它允許你將 ref 從父組件傳遞到子組件&#xff0c;從而直接訪問子組件的 DOM 節點或公開的方法。這對于需要操作子組件內部狀態或 DOM 的場景非常有用。為了使子組件能夠暴露其屬性和方法給父組件&#xf…

《C++ 實時視頻流物體跟蹤與行為分析全解析》

在當今科技飛速發展的時代&#xff0c;視頻監控與智能分析技術在眾多領域發揮著極為重要的作用。從安防監控到智能交通&#xff0c;從工業自動化到人機交互&#xff0c;利用 C 處理實時視頻流中的物體跟蹤和行為分析成為了熱門且極具挑戰性的研究與開發方向。本文將深入探討其中…

5G中的隨機接入過程可以不用收RAR?

有朋友提到了一種不用接收RAR的RA過程&#xff0c;問這個是怎么回事。其實在剛剛寫過的LTM cell switch篇章中就有提到&#xff0c;這里把所有相關的內容整理如下。 在RACH-less LTM場景&#xff0c;在進行LTM cell switch之前就要先知道target cell的TA信息&#xff0c;進而才…

git 導出某段時間修改的文件 windows

第一步&#xff1a;列出兩次commitID之間的文件變動 git diff oldid newid --name-only// 例如 git diff 4a886c57a8b5611a2abcfcd120461c2e92f7029a HEAD --name-only 4a886c57a8b5611a2abcfcd120461c2e92f7029a 代表之前 HEAD 代表最新或者換成某次commitID 例如&#xf…

Qt 聯合Halcon配置

文章目錄 配置代碼窗口綁定 配置 選擇添加庫 選擇外部庫 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…

new URL(`../assets/images/${name}`, import.meta.url).href

背景&#xff1a; 文章講述了Vite框架中關于資源文件&#xff08;如圖片&#xff09;在默認配置下&#xff0c;如何正確處理開發環境和打包后的不同引用方式。重點介紹了使用import.meta.url和new URL() 來動態獲取并處理靜態資源URL的方法&#xff0c;以及注意事項&#xff0…

8、筆記本品牌分類介紹:LG - 計算機硬件品牌系列文章

LG筆記本品牌以其高性能和先進技術而聞名&#xff0c;?提供多種型號以滿足不同用戶的需求。? LG筆記本產品線包括多種類型&#xff0c;?以滿足不同用戶的需求。?其中&#xff0c;?LG Gram Pro系列以其超薄設計和高性能配置受到關注。?該系列筆記本采用16:10的OLED顯示屏&…

367_C++_計算mouse移動過程中,視頻框的右側、底部邊距,以及根據實時的右側、底部邊距計算—視頻框的左上角位置

代碼分析 1. restorePos 方法 restorePos 的作用是恢復 NavigationFrame 的位置,將其移動到父窗口或者指定矩形內的特定位置。 void NavigationFrame::restorePos() {// 獲取目標矩形:優先使用 `m_pRect`,否則默認使用視頻區域或父窗口區域RSRect videoRect(m_pVide