第8天:面向對象編程入門 - 類與對象

第8天:面向對象編程入門 - 類與對象

一、📚 今日學習目標

  1. 🎯 掌握類與對象的定義與使用
  2. 🔧 理解封裝、繼承、多態三大特性
  3. 💡 完成銀行賬戶管理系統實戰
  4. 🛠? 學會構造函數與析構函數的編寫

二、?? 核心知識點詳解

1. 類的定義與對象創建

類的基本結構
class BankAccount {
private:string accountNumber;double balance;public:// 構造函數BankAccount(string accNo, double initialBalance) : accountNumber(accNo), balance(initialBalance) {}// 成員函數void deposit(double amount) {balance += amount;}bool withdraw(double amount) {if (balance >= amount) {balance -= amount;return true;}return false;}double getBalance() const {return balance;}
};// 創建對象
BankAccount myAccount("123456", 1000.0);

2. 封裝與訪問控制

成員訪問修飾符
class Person {
public:    // 公有成員string name;
protected:  // 受保護成員int age;
private:   // 私有成員string idCard;
};

3. 繼承與多態

繼承語法
class SavingsAccount : public BankAccount {
private:double interestRate;public:SavingsAccount(string accNo, double initialBalance, double rate): BankAccount(accNo, initialBalance), interestRate(rate) {}void addInterest() {balance += balance * interestRate / 100;}
};

三、🔧 代碼實戰:銀行賬戶管理系統

1. 功能需求

  • 創建不同類型的賬戶(儲蓄/支票)
  • 存款/取款操作
  • 計算利息(僅儲蓄賬戶)

2. 實現步驟

#include <iostream>
#include <vector>
#include <string>
using namespace std;class Account {
protected:string accountNumber;double balance;
public:Account(string accNo, double amt) : accountNumber(accNo), balance(amt) {}virtual void display() const = 0; // 純虛函數
};class SavingsAccount : public Account {
private:double interestRate;
public:SavingsAccount(string accNo, double amt, double rate): Account(accNo, amt), interestRate(rate) {}void deposit(double amt) {balance += amt;}void withdraw(double amt) {if (balance >= amt) {balance -= amt;}}void addInterest() {balance += balance * interestRate / 100;}void display() const override {cout << "儲蓄賬戶(" << accountNumber << "):余額$" << balance << endl;}
};class CheckingAccount : public Account {
public:CheckingAccount(string accNo, double amt): Account(accNo, amt) {}void deposit(double amt) {balance += amt;}bool withdraw(double amt) {if (balance >= amt) {balance -= amt;return true;}return false;}void display() const override {cout << "支票賬戶(" << accountNumber << "):余額$" << balance << endl;}
};int main() {vector<Account*> accounts;// 創建賬戶accounts.push_back(new SavingsAccount("SA123", 5000, 2.5));accounts.push_back(new CheckingAccount("CA456", 2000));// 存款操作accounts[0]->deposit(1000);accounts[1]->deposit(500);// 取款操作accounts[0]->withdraw(200);accounts[1]->withdraw(1500); // 余額不足// 顯示所有賬戶cout << "\n📊 賬戶信息:" << endl;for (const auto& acc : accounts) {acc->display();}// 清理內存for (auto acc : accounts) {delete acc;}return 0;
}

四、🛠? 進階技巧

1. 構造函數初始化列表

class Point {
public:Point(double x, double y) : x(x), y(y) {} // 直接初始化成員變量
private:double x, y;
};

2. 多態實現原理

// 純虛函數聲明
virtual void draw() = 0;// 重寫(override)關鍵字(C++11)
void draw() override;

3. 抽象類與接口

class Shape { // 抽象類
public:virtual void draw() = 0; // 純虛函數
};class Circle : public Shape {
public:void draw() override { /* 繪制圓 */ }
};

五、? 常見問題解答

Q:類和結構體有什么本質區別?
→ 默認訪問權限不同(類private/結構體public),設計意圖不同(類強調封裝/結構體側重數據組織)

Q:什么是虛函數??
→ 用于實現多態機制的成員函數,通過virtual關鍵字聲明

Q:構造函數可以調用虛函數嗎??
→ 不建議,此時虛函數調用的是基類的實現而非派生類


六、📝 今日總結

? 成功掌握:

  • 🔑 類的定義與對象創建方法
  • 🔒 封裝實現數據隱藏
  • 🌟 繼承與多態的基本應用
  • 💡 構造函數/析構函數的編寫規范

? 明日預告:

  • 模板編程基礎(泛型編程)

七、📝 課后挑戰任務

1.🌟 完善銀行系統:

  • 添加賬戶類型判斷功能
  • 實現按賬戶類型統計總金額

2. 🔍 抽象類應用:

// 完成圖形面積計算程序
class Shape {
public:virtual double area() = 0;
};class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double area() override { return 3.14 * radius * radius; }
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}double area() override { return width * height; }
};int main() {Shape* shapes[2];shapes[0] = new Circle(5);shapes[1] = new Rectangle(4, 6);cout << "總面積:" << shapes[0]->area() + shapes[1]->area() << endl;// 釋放內存delete[] shapes;return 0;
}

3.📝 技術總結:

  • 列舉面向對象編程的5個典型應用場景

🔍 上一天課后挑戰任務答案

任務1:圖書館管理系統擴展(知識點拆解)

📚 核心知識點
  1. ?結構體擴展?

    • 在原有LibraryBook結構體中添加borrowerNameisBorrowed字段
    • 示例代碼:
      struct LibraryBook {string isbn;string title;string author;double price;string borrowerName;bool isBorrowed;
      };
      
  2. ?動態數據管理?

    • 使用vector<LibraryBook>存儲圖書信息
    • 添加借閱邏輯:
      // 借閱操作
      void borrowBook(vector<LibraryBook>& books, const string& isbn, const string& name) {for (auto& book : books) {if (book.isbn == isbn && !book.isBorrowed) {book.borrowerName = name;book.isBorrowed = true;cout << "📖《" << book.title << "》已借出!" << endl;return;}}cout << "📝 該書不可借閱或已被借出!" << endl;
      }
      
  3. ?范圍查詢實現?

    • 按價格區間篩選圖書:
      vector<LibraryBook> filterByPrice(const vector<LibraryBook>& books, double minPrice, double maxPrice) {vector<LibraryBook> result;for (const auto& book : books) {if (book.price >= minPrice && book.price <= maxPrice) {result.push_back(book);}}return result;
      }
      
🛠? 實現技巧
  • ?數據持久化:使用文件流保存借閱記錄(fstream
  • ?界面優化:添加菜單循環和輸入驗證
  • ?異常處理:處理無效ISBN輸入(cin.fail()

任務2:時間格式轉換程序(深入解析)

🔍 關鍵知識點
  1. ?聯合體(Union)的特性?

    • 所有成員共享同一塊內存地址
    • 示例內存布局:
      totalSeconds (int) | hours (int) | minutes (int) | seconds (int)
      -----------------------------------------------
      0x0000           | 0x0004       | 0x0008        | 0x000C
      
  2. ?類型轉換方法?

    • 通過成員訪問符切換不同視圖:
      Time t;
      t.totalSeconds = 3661; // 初始化為總秒數
      cout << "小時:" << t.hours << endl; // 自動轉換顯示
      
  3. ?取模運算原理?

    • 計算時分秒的數學公式:
      hours = totalSeconds / 3600
      remaining = totalSeconds % 3600
      minutes = remaining / 60
      seconds = remaining % 60
      
🎯 進階應用
  • ?時區轉換:添加時區偏移量參數
  • ?閏年判斷:擴展日期計算功能
  • ?時間格式化:輸出ISO 8601標準格式(YYYY-MM-DD HH:MM:SS

任務3:技術總結表(知識點擴展)

應用場景結構體設計要點實際開發建議
學生信息管理包含學號/姓名/成績/年級使用std::vector存儲動態數據
幾何圖形計算包含坐標/面積/周長重載運算符(如+表示向量相加)
文件元數據存儲包含創建時間/修改時間/大小使用struct代替class提升效率
通信協議解析包含版本號/數據長度/校驗和添加序列化(serialization)功能
📊 內存對比示意圖
// 結構體內存布局示例
struct Student {int id;         // 4 byteschar name[20];  // 20 bytesfloat score;    // 4 bytes
};// 聯合體內存布局示例
union Data {int integer;    // 4 bytesdouble floating; // 8 byteschar character; // 1 byte
};

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

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

相關文章

Hadoop之02:MapReduce編程模型

MapReduce編程模型 理解MapReduce編程模型獨立完成一個MapReduce程序并運行成功了解MapReduce工程流程掌握并描述出shuffle全過程&#xff08;面試&#xff09;獨立編寫課堂及作業中的MR程序理解并解決數據傾斜 1. MapReduce編程模型 Hadoop架構圖 Hadoop由HDFS分布式存儲、M…

2.7 大模型RAG內容安全合規檢查-大模型ACP模擬題-真題

單選題 在RAG應用中&#xff0c;輸入內容合規檢查的正確順序是&#xff1f; A. 先處理模型生成&#xff0c;后檢查用戶輸入 B. 先檢查用戶輸入&#xff0c;后處理模型生成 ? C. 僅檢查用戶輸入 D. 僅檢查模型輸出 解析&#xff1a;合規流程應優先過濾用戶輸入風險&#xff0…

mapbox基礎,使用geojson加載heatmap熱力圖層

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??heatmap熱力圖層樣式二、??使用geojs…

Deepseek Api Function Calling解析(tools、tool_calls)Deepseek函數調用流程圖、Python代碼示例

文章目錄 Function Calling介紹**核心原理**1. **動態擴展模型能力**2. **JSON結構化交互** **實現步驟**&#xff08;以支持Function Calling的模型為例&#xff09;1. **定義可用函數**2. **模型匹配與生成**3. **開發者執行函數**4. **結果反饋給模型** **DeepSeek R1的當前…

在2023idea中如何創建SpringBoot

目錄 一.下載和安裝 Maven 1.前往 https://maven.apache.org/download.cgi 下載最新版的 Maven 程序 2.將文件解壓到D:Program FilesApachemaven目錄 3.新建環境變量MAVEN_HOME&#xff0c;賦值D:Program FilesApachemaven 4.編輯環境變量Path&#xff0c;追加%MAVEN_HOME…

基于YOLO11深度學習的遙感視角農田檢測與分割系統【python源碼+Pyqt5界面+數據集+訓練代碼】深度學習實戰、目標分割、人工智能

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

用冒泡排序法模擬qsort函數

目錄 1.前言 2.qsort函數的介紹 ?3.冒泡法回顧 4.模擬qsort---buble_sort 4.1 buble_sort格式 4.2 主函數&#xff0c;以int類型為例 4.3comp_int函數的功能設計 4.4 swap函數的功能設計 5. 總代碼概覽 1.前言 今天&#xff0c;小鄧兒帶大家用冒泡排序法來模擬一下qs…

全星研發項目管理APQP軟件系統:鑄造芯片集成電路產業研發體系化建設平臺

全星研發項目管理APQP軟件系統&#xff1a;鑄造芯片集成電路產業研發體系化建設平臺 在芯片集成電路行業&#xff0c;研發效率和質量直接決定了企業的核心競爭力。面對日益復雜的芯片設計、日益縮短的產品生命周期以及日益嚴格的質量要求&#xff0c;傳統的研發管理模式已難以滿…

《Python實戰進階》No 11:微服務架構設計與 Python 實現

第11集&#xff1a;微服務架構設計與 Python 實現 2025年3月3日更新了代碼和微服務運行后的系統返回信息截圖&#xff0c;所有代碼在 python3.11.5虛擬環境下運行通過。 微服務架構通過將復雜應用拆分為獨立部署的小型服務&#xff0c;顯著提升了系統的可擴展性和維護性。本集…

USRP7440-通用軟件無線電平臺

1、產品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架構&#xff0c;它將射頻ADC、DAC、ARM、FPGA等集成一體&#xff0c;瞬時帶寬可以達到2.5GHz&#xff0c;尤其適合于射頻直采應用&#xff0c;比如通信與雷達。 第一代RFSOC高達4GHz ? 8x 或 16x 6.554GSPS DAC…

1.2.3 使用Spring Initializr方式構建Spring Boot項目

本實戰概述介紹了如何使用Spring Initializr創建Spring Boot項目&#xff0c;并進行基本配置。首先&#xff0c;通過Spring Initializr生成項目骨架&#xff0c;然后創建控制器HelloController&#xff0c;定義處理GET請求的方法hello&#xff0c;返回HTML字符串。接著&#xf…

【小羊肖恩】小羊杯 Round 2 C+K

題目鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/100672#question C.是毛毛蟲嗎&#xff1f; 思路&#xff1a; 其實很簡單&#xff0c;假設我們要滿足題目所給條件&#xff0c;那么這個毛毛蟲最壞情況下肯定是一條如下圖所示的無向圖 右端省略號為對稱圖形 &…

不謂俠--記錄

音樂《不謂俠》 衣襟上 別好了晚霞 余暉送我牽匹老馬 正路過 煙村里人家 恰似當年故里正飛花 醉過風 喝過茶 尋常巷口尋個酒家 在座皆算老友 碗底便是天涯 天涯遠 無處不為家 蓬門自我也像廣廈 論意氣 不計多或寡 占三分便敢自稱為俠 刀可捉 拳也耍 偶爾閑來…

不同規模企業如何精準選擇AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析與對比

本文深入探討了最近國內外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技術細節、性能表現、應用場景及局限性&#xff0c;并從技術能力、功能需求、成本預算、數據安全和合規以及服務與支持五個關鍵維度&#xff0c;詳細分析了不同規模企業在選擇 AI 工具時的考量因素…

Vue核心知識:KeepLive全方位分析

KeepAlive 是 Vue 組件中的一個重要功能&#xff0c;主要用于緩存組件&#xff0c;以提升性能和用戶體驗。 目錄 一、KeepAlive 基本概念二、KeepAlive 的核心原理三、KeepAlive 關鍵屬性解析1. include&#xff1a;指定需要緩存的組件2. exclude&#xff1a;指定不需要緩存的組…

【電力——tarjan割點,求連通塊】

題目 分析 這是割點的板子 代碼 #include <bits/stdc.h> using namespace std;const int N 1e410; const int M 3e410;int h[N], e[M], ne[M], idx; int dfn[N], low[N], tot; int root, ans;void add(int a, int b) // 添加一條邊a->b {e[idx] b, ne[idx] h…

【HTTP】解碼網絡通信的奧秘:HTTP,IP 地址,端口,DNS及NAT地址轉換的協同之舞

引言 每文學習一句詩&#xff1a;行一棋不足以見智&#xff0c;彈一弦不足以見悲 ——《淮南子說林訓》 譯文&#xff1a;走一個棋子&#xff0c;不足以現出智慧&#xff1b;彈一根琴弦&#xff0c;不能夠使人產生悲哀之情。 自述&#xff1a;互聯網現如今已經成為每個人都離不…

18、深拷貝與淺拷貝的區別【中高頻】

淺拷貝 淺拷貝只是拷貝了一個指針&#xff0c;并沒有開辟一塊新的內存。拷貝的指針和原來的指針 指向同一塊地址。當一個對象修改了資源&#xff0c;另一個對象也會受到影響&#xff0c;因此淺拷貝是有風險的&#xff1a;當兩個對象都銷毀 并調用析構函數時&#xff0c;會造成…

【Linux】從入門到精通:Make與Makefile完全指南

歡迎來到 CILMY23 的博客 &#x1f3c6;本篇主題為&#xff1a;從入門到精通&#xff1a;Make與Makefile完全指南 &#x1f3c6;個人主頁&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列專欄&#xff1a;C | C語言 | Linux | Python | 數據結構和算法 | 算法專題 &#x1…

利用PyQt簡單的實現一個機器人的關節JOG界面

在上一篇文章中如何在Python用Plot畫出一個簡單的機器人模型&#xff0c;我們介紹了如何在Python中畫出一個簡單的機器人3D模型&#xff0c;但是有的時候我們需要通過界面去控制機器人每一個軸的轉動&#xff0c;并實時的顯示出當前機器人的關節位置和末端笛卡爾位姿。 那么要實…