從零到一學習c++(基礎篇--筑基期十一-類)

?從零到一學習C++(基礎篇) 作者:羨魚肘子

溫馨提示1:本篇是記錄我的學習經歷,會有不少片面的認知,萬分期待您的指正。

?溫馨提示2:本篇會盡量用更加通俗的語言介紹c++的基礎,用通俗的語言去解釋術語,但不會再大白話了哦。常見,常看,常想,漸漸的就會發現術語也是很簡單滴。

?溫馨提示3:看本篇前可以先了解前篇的內容,知識體系會更加完整哦。

從零到一學習c++(基礎篇--筑基期十-函數)-CSDN博客

?

?溫馨提示4:這部分內容只是入門c++類的一個預覽,就基礎階段而言應該是夠用的,學習的重心在于了解

類?(Class)

類(Class)是C++面向對象編程(OOP)的核心,相當于設計圖紙,用來創建具有特定屬性和行為的對象。

那么什么是面向對象編程(OOP呢?

在這我們拋開傳統的術語,從日常生活的角度重新解讀面向對象編程(OOP)


1. 角色扮演游戲:把代碼變成「游戲角色」

想象我們在開發一款 RPG 游戲,每個角色都有自己的屬性和技能:

  • 類(Class)?=?角色模板
    比如「戰士」「法師」的職業模板,定義了他們默認的血量、攻擊方式。

  • 對象(Object)?=?具體的游戲角色
    比如你創建了一個叫「亞瑟」的戰士,他的等級、裝備都是獨特的。

  • 封裝(Encapsulation)?=?角色的隱私保護
    角色的背包里有什么裝備,其他角色不能直接翻看,必須通過「交易」或「查看」方法交互。

  • 繼承(Inheritance)?=?職業繼承通用能力
    「戰士」和「法師」都繼承了「玩家角色」的基礎屬性(比如移動、說話),但各自擴展了專屬技能。

  • 多態(Polymorphism)?=?同一技能的不同效果
    所有角色都有「攻擊」技能,但戰士用劍砍,法師放火球,效果完全不同。


2. 樂高積木:模塊化拼裝代碼

把編程想象成拼樂高:

  • 類(Class)?=?積木的模具
    比如一個「輪子模具」,可以生產無數個輪子(對象)。

  • 對象(Object)?=?具體的積木塊
    用輪子模具造出 4 個輪子,裝到一輛車上。

  • 組合(Composition)?=?用積木拼裝復雜結構
    車 = 輪子 + 車身 + 引擎,每個部分獨立開發,最后組合成整體。

  • 接口(Interface)?=?積木的拼接規則
    所有能連接到車身的積木,必須有一個「卡扣接口」,不管它是輪子還是翅膀。


3. 自然界:生物學中的 OOP 思維

用生物進化理解 OOP:

  • 類(Class)?=?物種分類
    比如「貓科動物」的定義:有爪子、會捕獵。

  • 對象(Object)?=?個體生物
    你家的橘貓「大胖」,是「貓科動物」類的一個實例。

  • 繼承(Inheritance)?=?遺傳與變異
    老虎繼承了貓科動物的基礎特征,但變異出了條紋皮毛。

  • 多態(Polymorphism)?=?生存策略的多樣性
    所有動物都要「覓食」,但老鷹抓魚,羚羊吃草,行為完全不同。


那到底為什么要用 OOP呢?

  • 現實映射:代碼結構和現實世界一致,人類更容易理解(比如游戲角色、公司員工)。

  • 分工合作:像流水線一樣,不同程序員負責不同類,最后組裝成大系統。

  • 減少重復:公共功能寫在父類,子類直接復用(比如所有員工都要打卡)。

  • 靈活擴展:新增功能像「打補丁」,不影響原有代碼(比如給游戲角色加一個新技能)。


一句話總結:

OOP 是把復雜問題拆解成一個個「活的對象」,讓代碼像現實世界一樣,通過分工、協作、進化來解決問題。

?

一、類的基礎:封裝與抽象(抽象會放到下一個階段介紹)

1. 類是什么?

?類的定義通常包括以下部分:

  • 數據成員:類的屬性,用于存儲對象的狀態。

  • 成員函數:類的行為,用于操作數據成員或執行其他任務。

  • 訪問控制:通過publicprivateprotected關鍵字控制成員的訪問權限。

?詳細解釋--訪問控制

  • public:公有成員可以在類的外部訪問。

  • private:私有成員只能在類的內部訪問。

  • protected:保護成員可以在類的內部和派生類中訪問。

  • 類就像汽車的設計圖紙,定義了汽車的組成部分(屬性)和功能(方法)。

  • 代碼示例

    class Car {
    public:// 屬性(成員變量)string brand;int speed;// 方法(成員函數)void accelerate() { speed += 10; }void brake() { speed = 0; }
    };

2. 封裝:隱藏細節,暴露接口

  • 駕駛員不需要知道發動機如何工作,只需踩油門(調用方法)。

  • 訪問控制

    • public:對外公開(如油門、剎車)。

    • private:內部細節(如發動機、電路)。

    class BankAccount {
    private:double balance; // 私有屬性,外部無法直接訪問
    public:void deposit(double amount) { balance += amount; } // 公開方法
    };

3.類與結構體(struct

  • class默認成員為privatestruct默認成員為public

  • 現代C++中,struct常用于僅包含數據的簡單類型(POD類型)。


二、構造函數與析構函數

1. 構造函數:對象的“出生證明”

  • 作用:初始化對象屬性。

  • 默認構造函數:無參數或參數有默認值。

  • 委托構造函數(C++11):復用其他構造函數的代碼。

    class Student {
    public:Student() : Student("匿名", 18) {} // 委托構造函數Student(string name, int age) : name(name), age(age) {}
    private:string name;int age;
    };

2. 析構函數:對象的“臨終清理”

  • 作用:釋放對象占用的資源(如內存、文件句柄)。

  • 現代C++技巧:用智能指針(unique_ptr/shared_ptr)替代手動資源管理。

    class FileHandler {
    public:FileHandler(const string& filename) {file = fopen(filename.c_str(), "r");}~FileHandler() { if (file) fclose(file); } // 析構時關閉文件
    private:FILE* file;
    };

三、類的進階特性

1. 移動語義(C++11)

  • 問題:傳統拷貝構造效率低(深拷貝大對象)。

  • 解決:“偷”臨時對象(右值)的資源,避免拷貝。

    class DynamicArray {
    public:// 移動構造函數DynamicArray(DynamicArray&& other) noexcept : data_(other.data_), size_(other.size_) {other.data_ = nullptr; // 原對象置空other.size_ = 0;}
    private:int* data_;size_t size_;
    };

2.?constexpr?成員函數(C++11)

  • 作用:編譯期求值的函數,用于常量表達式。

    class Circle {
    public:constexpr Circle(double r) : radius(r) {}constexpr double area() const { return 3.14 * radius * radius; }
    private:double radius;
    };constexpr Circle c(5.0);
    constexpr double a = c.area(); // 編譯期計算面積

3. 類成員的默認和刪除(C++11)

  • 默認函數:顯式要求編譯器生成默認實現。

  • 刪除函數:禁用某些函數(如拷貝構造)。

    class NonCopyable {
    public:NonCopyable() = default;NonCopyable(const NonCopyable&) = delete; // 禁止拷貝
    };

四、繼承與多態

1. 繼承:從基類“遺傳”特性

  • 電動汽車(子類)繼承汽車(基類)的基本屬性,并增加電池特性。

    class ElectricCar : public Car {
    public:void charge() { battery = 100; }
    private:int battery;
    };

2. 多態:同一接口,不同實現

  • 虛函數:基類聲明?virtual,子類用?override?重寫(C++11)。

    class Shape {
    public:virtual double area() const = 0; // 純虛函數(抽象類)
    };class Circle : public Shape {
    public:double area() const override { return 3.14 * r * r; } // 重寫
    private:double r;
    };

五、現代C++最佳實踐

1. 用?override?和?final?明確意圖(C++11)

  • override:顯式標記重寫虛函數,避免拼寫錯誤。

  • final:禁止子類進一步重寫。

    class Base {
    public:virtual void func() {}
    };class Derived : public Base {
    public:void func() override final {} // 正確重寫,且禁止子類重寫
    };

2. 委托構造與繼承構造(C++11)

  • 繼承構造函數:復用基類構造函數。

    class Base {
    public:Base(int x) { /*...*/ }
    };class Derived : public Base {
    public:using Base::Base; // 繼承基類構造函數
    };

3. 智能指針管理資源

  • unique_ptr:獨占資源所有權。

  • shared_ptr:共享資源所有權。

    class Project {
    public:void addMember(const shared_ptr<Member>& m) {members.push_back(m);}
    private:vector<shared_ptr<Member>> members;
    };

    ?

六、綜合示例:現代C++類的設計(體會一下這種風格就好,目前這是了解的內容)

#include <iostream>
#include <memory>
#include <vector>// 基類:圖形
class Shape {
public:virtual double area() const = 0; // 純虛函數virtual ~Shape() = default;      // 虛析構函數(C++11)
};// 派生類:圓形
class Circle : public Shape {
public:constexpr Circle(double r) noexcept : radius(r) {}double area() const override { return 3.14 * radius * radius; }
private:double radius;
};// 圖形管理器(RAII管理資源)
class ShapeManager {
public:void addShape(std::unique_ptr<Shape> shape) {shapes.push_back(std::move(shape));}void printAreas() const {for (const auto& s : shapes) {std::cout << "面積: " << s->area() << std::endl;}}
private:std::vector<std::unique_ptr<Shape>> shapes;
};int main() {ShapeManager manager;manager.addShape(std::make_unique<Circle>(5.0)); // C++14的make_uniquemanager.printAreas();return 0;
}

七、總結:類的設計原則(建議熟悉哦,以后會經常用到的)

  1. 高內聚低耦合:每個類專注單一職責,減少依賴。

  2. 優先使用組合:通過組合其他類構建功能,而非過度繼承。

  3. 資源管理:用RAII(如智能指針)替代手動new/delete

  4. 擁抱現代特性:移動語義、overrideconstexpr等提升代碼質量。

小貼士:類就是自己的“代碼樂高積木”,設計得越清晰、模塊化,程序越容易維護和擴展!

?從零到一學習c++(基礎篇--筑基期)結語

自此,我們c++的基礎篇--筑基期部分就結束了,通過筑基期的學習我們對c++的一些基礎知識有了概要性的了解,但是讓我們獨自去開發某一個項目的話,是不是感覺還是比較困難的呢??不要灰心,因為我們還沒有真正入門。歐克,趁熱打鐵,開始從零到一學習c++(基礎篇--入門期)的學習吧!!!通過從零到一學習c++(基礎篇--入門期)的學習,我們就可以比較輕松的實現一些小的項目和小部分大型工程啦。

?

?

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

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

相關文章

DeepSeek技術全景解析:架構創新與行業差異化競爭力

一、DeepSeek技術體系的核心突破 架構設計&#xff1a;效率與性能的雙重革新 Multi-head Latent Attention (MLA)&#xff1a;通過將注意力頭維度與隱藏層解耦&#xff0c;實現顯存占用降低30%的同時支持4096超長上下文窗口。深度優化的MoE架構&#xff1a;結合256個路由專家…

插入排序:一種簡單而直觀的排序算法

大家好&#xff01;今天我們來聊聊一個簡單卻非常經典的排序算法——插入排序&#xff08;Insertion Sort&#xff09;。在所有的排序算法中&#xff0c;插入排序是最直觀的一個。 一、插入排序的基本思想 插入排序的核心思想是&#xff1a;將一個待排序的元素&#xff0c;插…

2025年校園網絡招聘會匯總

1、衛生健康行業2025屆畢業生春季校園網絡招聘會 企業數量職位數量崗位數量10020002000 訪問地址&#xff1a; https://www.weirenjob.com/zph/zph_wsjkxy2025jbyscjxywlzph/ 2、山東地區面向2025屆高校畢業生網絡招聘活動 企業數量職位數量崗位數量909271052434 訪問地址&a…

Windows 10 GPU STACK 0.5.1 安裝

Windows 10 GPU STACK 0.5.1 安裝 1 GPUStack 安裝1.Python安裝&#xff08;3.10/11/12&#xff09;2.GPUStack 下載3.生成密碼4.訪問5.設置模型下載目錄6.禁用開機自啟并重啟服務7.安裝模型8.查看安裝的進度 2.試驗場聊天測試1.對話模式 3.API Key 測試 1 GPUStack 安裝 1.Py…

【數據結構】快指針和慢指針

一、 給你單鏈表的頭結點 head ,請你找出并返回鏈表的中間結點。如果有兩個中間結點,則返回第二個中間結點。 要求&#xff1a;只遍歷一遍鏈表 可以使用快慢指針&#xff1a;fast 一次走兩步&#xff0c;slow 一次走一步。當 fast NULL&#xff08;偶數個結點&#xff09;或…

1.3 嵌入式系統的固件

嵌入式系統的固件&#xff0c;一般情況下的作用是: 1.硬件抽象層&#xff08;HAL&#xff09;&#xff1a;固件提供了一個硬件抽象層&#xff0c;它將硬件的復雜性隱藏起來&#xff0c;為上層軟件提供了一套標準的接口。這樣&#xff0c;操作系統和應用程序不需要直接與硬件打交…

中國工業互聯網研究院:人工智能大模型年度發展趨勢報告

當前&#xff0c;以大模型為代表的人工智能正快速演進&#xff0c;激發全球科技之變、產業之變、時代之變&#xff0c;人工智能發展迎來新高潮。隨著大模型推理、多模態生成、智能體等創新技術的發展&#xff0c;大模型賦能千行百業將進一步提速。中國工業互聯網研究院全方位剖…

【cv】vs2022配置opencv

release下配置包含目錄和庫目錄 E:\sdk\sdk_cuda12.3\opencv490\include E:\sdk\sdk_cuda12.3\opencv490\include\opencv2 E:\sdk\sdk_cuda12.3\opencv490\lib release下配置包含鏈接器輸入的依附依賴項 opencv_world490.lib release編譯文件夾下需手動復制opencv_world49…

Python Pandas庫使用指南:從入門到精通

1. 引言 Pandas 是 Python 中用于數據處理和分析的核心庫之一。它提供了高效的數據結構(如 DataFrame 和 Series),能夠輕松處理結構化數據,支持數據清洗、過濾、聚合、合并等操作。Pandas 在數據分析、機器學習和科學計算領域中被廣泛使用。 本文將詳細介紹 Pandas 的基本…

Visual Studio中打開多個項目

1) 找到解決方案窗口 2) 右鍵添加→ 選擇現有項目 3) 選擇.vcxproj文件打開即可

react路由總結

目錄 一、腳手架基礎語法(16~17) 1.1、hello react 1.2、組件樣式隔離(樣式模塊化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相關API 2.1.1、內置組件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

內外網隔離文件傳輸解決方案|系統與釘釘集成+等保合規,安全提升70%

一、背景與痛點 在內外網隔離的企業網絡環境中&#xff0c;員工與外部協作伙伴&#xff08;如釘釘用戶&#xff09;的文件傳輸面臨以下挑戰&#xff1a; 1. **安全性風險**&#xff1a;內外網直連可能導致病毒傳播、數據泄露。 2. **操作繁瑣**&#xff1a;傳統方式需頻繁切…

多線程篇學習面試

多線程 1.樂觀鎖、CAS思想 java樂觀鎖機制&#xff1a; ? 樂觀鎖體現的是悲觀鎖的反面。它是一種積極的思想&#xff0c;它總是認為數據是不會被修改的&#xff0c;所以是不會對數據上鎖的。但是樂觀鎖在更新的時候會去判斷數據是否被更新過。樂觀鎖的實現方案一般有兩種&a…

云服務器和物理服務器該如何選擇

隨著互聯網的快速發展&#xff0c;企業大多都會選擇云服務器和物理服務器進行使用&#xff0c;那么對于云服務器和物理服務器兩者之間該如何進行選擇呢&#xff1f; 云服務器可以為用戶和企業提供網站處理中等到高流量所需要的一切&#xff0c;云服務器中的高可用能性功能&…

將產品照片(form.productPhotos)轉為 JSON 字符串發送給后端

文章目錄 1. 前端 form.productPhotos 的當前處理a. 組件綁定b. 當前發送邏輯 2. 如何將 form.productPhotos 轉為 JSON 字符串發送給后端a. 修改前端 save() 方法b. 確保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代碼&#xff0c;我將分析如何將產品照片&a…

SpringCloud系列教程:微服務的未來(二十五)-基于注解的聲明隊列交換機、消息轉換器、業務改造

前言 在現代分布式系統中&#xff0c;消息隊列是實現服務解耦和異步處理的關鍵組件。Spring框架提供了強大的支持&#xff0c;使得與消息隊列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成變得更加便捷和靈活。本文將深入探討如何利用Spring的注解驅動方式來配置和管理隊…

國產編輯器EverEdit - 文本編輯器的關鍵特性:文件變更實時監視,多頭編輯不掉坑

1 監視文件變更 1.1 應用場景 某些時候&#xff0c;用戶會使用多個編輯器打開同一個文件&#xff0c;如果在A編輯器修改保存&#xff0c;但是B編輯器沒有重新打開&#xff0c;直接在B編輯器修改再保存&#xff0c;則可能造成在A編輯器中修改的內容丟失&#xff0c;因此&#x…

HAProxy介紹與編譯安裝

目錄 1、HAProxy介紹 2、HAProxy編譯安裝 Centos 基礎環境 Ubuntu 基礎環境 編譯安裝HAProxy 驗證HAProxy版本 HAProxy啟動腳本 配置文件 啟動haproxy 驗證haproxy狀態 查看haproxy的狀態頁面 1、HAProxy介紹 HAProxy是法國開發者 威利塔羅(Willy Tarreau) 在2000年…

python類型轉換深淺拷貝

1.類型轉換 1.1 int(x):轉化為一個整數&#xff0c;只能轉換由純數字組成的字符串 float->int 浮點型強轉整形會去掉小數點后面的數&#xff0c;只保留整數部分 a 1.2 print(type(a)) #<class float> b int(a) print(type(b)) #<class int>print(int…

分布式光纖聲波振動技術在鉆井泄漏檢測中的應用

在石油天然氣的鉆井作業中&#xff0c;及時發現并定位泄漏點對于保障開采安全、降低環境污染以及避免經濟損失至關重要。傳統的泄漏檢測方法往往存在局限性&#xff0c;而分布式光纖聲波振動技術憑借其獨特的優勢&#xff0c;正逐漸成為鉆井過程中尋找泄漏的有力工具。 技術原理…