本教程涵蓋 C++ 對 C 的核心擴展、類與對象、構造析構、運算符重載、繼承派生、多態機制、抽象類與面向接口編程、C 語言回調模擬多態等核心知識體系,適合從 C 轉 C++ 或夯實基礎的開發者系統學習。
namespace解決全局標識符衝突。std 封裝標準庫。三種用法:std::cout、using std::cout、using namespace std。支持嵌套與別名。
register 可取地址(編譯器自動優化,忽略請求)。struct 直接成爲類型名,無需 typedef。bool 類型關鍵字 true/false,佔 1 字節,非 0 自動轉 true。替代宏與整型標誌位。
C++ 中 (a<b?a:b)=10 合法,因返回變量本身(實為常指針)。若含常量則不可作左值。
const 深度解析| 聲明 | 含義 |
|---|---|
const int* p | 指向常量的指針(數據不可改) |
int* const p | 常指針(指針不可改) |
const int* const p | 指向常量的常指針 |
C++ const vs C const:C++ const 編譯期進符號表,不佔存儲(除非取址/extern/全局),可作數組長度、模板參數;C const 為只讀變量,佔存儲。
引用是**已定義變量的別名**,底層實現為**常指針** T* const。聲明時必須初始化,之後不可重新綁定。
void f(int& x) 直接操作實參。int& f() { static int x; return x; } f() = 10;const T& 延長生命周期:const int& r = 10; 編譯器生成臨時變量。T*& 修改實參指針指向(如工廠函數分配內存)。const 引用綁定字面值時編譯器隱式創建臨時對象。public/protected/private 控制成員可見性。struct 默認 public,class 默認 private。友元 friend 打破封裝(函數/類)。
~Class(),逆序調用(成員→基類)。operator=(檢查自賦值、釋放舊資源、分配新資源、拷貝數據、返回 *this)。new T[n] 調用默認構造,delete[] 逆序析構。static 成員屬於類,不屬於對象。聲明在類內,定義在類外 int Class::member = 0;。靜態函數無 this,只能訪問靜態成員。
this 指針Class* const this。this,類似全局函數但受訪問控制。sizeof(Class) 不包含靜態成員與函數代碼。Complex operator+(const Complex& rhs),左操作數為 *this。friend):Complex operator+(const Complex&, const Complex&),雙操作數顯式,支持隱式轉換(如 `cout << obj`)。= [] () ->(涉及對象內部狀態/調用語義)。
| 運算符 | 返回類型 | 關鍵點 |
|---|---|---|
+ - * / | 值 | 返回臨時對象,不可為引用 |
+= -= | T& | 修改 *this,返回引用支持鏈式 |
++ -- 前置 | T& | 修改後返回 *this |
++ -- 後置 | 值 | 參數 int 佔位,保存舊值返回 |
[] | T&/const T& | 支持讀寫,常做雙重載 |
() | 任意 | 仿函數調用語法 |
<< >> | ostream&/istream& | 全局 friend,返回流引用支持鏈式 |
= | T& | 深拷貝,檢查自賦值,釋放舊資源 |
-> * | 指針/引用 | 智能指針核心,模擬原生指針行為 |
&& || ,(逗號運算符):重載後失去短路求值/順序點語義,參數會預先求值。
| 基類成員 | public 繼承 | protected 繼承 | private 繼承 |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | 不可訪問 | 不可訪問 | 不可訪問 |
「三看原則」:看調用位置(類內/外)、看繼承方式、看基類成員屬性。
菱形繼承導致基類子對象重複,數據冗余與二義性。virtual 繼承確保僅一份基類子對象,通過虛基類表指針間接訪問。構造時**最派生類**直接調用虛基類構造,中間類不再調用。
virtual 函數,派生類**同原型**重寫(override)。ptr->vfunc() → ptr->vptr[vfunc_index](),運行期動態綁定。sizeof 含虛函數類 = 數據成員 + vptr(通常 4/8 字節)。delete base_ptr 釋放派生對象時,若基類析構非虛,僅調用基類析構 → 派生資源洩漏。=0:強制派生類實現,構成抽象類,不可實例化。可提供定義供派生類調用。class ISocketProtocol {
public:
virtual bool connect(const char* ip, int port) = 0;
virtual int send(const void* buf, int len) = 0;
virtual int recv(void* buf, int len) = 0;
virtual ~ISocketProtocol() {} // 虛析構
};
多實現類繼承接口,框架層依賴抽象,具體廠商實現注入(依賴倒置/控制反轉 IOC)。
C++ 無 `interface` 關鍵字,慣用**純抽象類**模擬。類可繼承多個接口(無數據成員、無實現),避免菱形與二義性,實現「接口隔離」。
typedef int (*EncFunc)(unsigned char* in, int inLen,
unsigned char* out, int* outLen, void* ctx, int ctxLen);
Socket 庫定義 EncFunc/DecFunc 類型,預留註冊入口 register_encrypt(EncFunc)。多廠商加密庫實現協議,運行期動態加載並註冊,核心庫零修改集成新算法。
常見誤區:
virtual(構造不能虛、內聯虛函數無意義、性能開銷)。