?從零到一學習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. 類是什么?
?類的定義通常包括以下部分:
-
數據成員:類的屬性,用于存儲對象的狀態。
-
成員函數:類的行為,用于操作數據成員或執行其他任務。
-
訪問控制:通過
public
、private
和protected
關鍵字控制成員的訪問權限。
?詳細解釋--訪問控制
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
默認成員為private
,struct
默認成員為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;
}
七、總結:類的設計原則(建議熟悉哦,以后會經常用到的)
-
高內聚低耦合:每個類專注單一職責,減少依賴。
-
優先使用組合:通過組合其他類構建功能,而非過度繼承。
-
資源管理:用RAII(如智能指針)替代手動
new
/delete
。 -
擁抱現代特性:移動語義、
override
、constexpr
等提升代碼質量。
小貼士:類就是自己的“代碼樂高積木”,設計得越清晰、模塊化,程序越容易維護和擴展!
?從零到一學習c++(基礎篇--筑基期)結語
自此,我們c++的基礎篇--筑基期部分就結束了,通過筑基期的學習我們對c++的一些基礎知識有了概要性的了解,但是讓我們獨自去開發某一個項目的話,是不是感覺還是比較困難的呢??不要灰心,因為我們還沒有真正入門。歐克,趁熱打鐵,開始從零到一學習c++(基礎篇--入門期)的學習吧!!!通過從零到一學習c++(基礎篇--入門期)的學習,我們就可以比較輕松的實現一些小的項目和小部分大型工程啦。
?
?