首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C++ 程式設計技巧精要:從 new/delete 到模板庫的現代化實踐

     編輯:更多程式設計知識

1. 動態記憶體:new/delete 取代 malloc/free

  • 自動計算大小,無需 sizeof
  • 回傳正確型別指標,免強制轉型
  • 支援初始化:new int(100)、new int[10]{}
  • 陣列釋放必配 delete[]
int* p = new int[10]; // 配置
delete[] p;             // 釋放
int* q = new int(42);   // 單物件帶初值
delete q;

現代建議:優先使用智慧指標 (std::unique_ptr, std::shared_ptr) 與容器 (std::vector, std::string),避免裸指標。

2. inline 函數取代巨集

// 巨集缺陷:abs(i++) 展開為 ((i++) < 0 ? -(i++) : (i++)) 雙重副作用
#define ABS(x) ((x) < 0 ? -(x) : (x))

// inline 無副作用、型別安全、可除錯
inline int Abs(int x) { return x < 0 ? -x : x; }

編譯器會視情況內展,保留函數語意優勢。

3. 函數多載:同名不同參

void Draw(int x, int y);        // 座標繪圖
void Draw(const char* text);    // 文字繪圖
void Draw(const Rect& r);       // 矩形繪圖

減少命名認知負擔 (DrawText, DrawRect…),配合預設參數更靈活。

4. 參考 傳遞取代指標

// C 風格
void Increment(int* p) { (*p)++; }

// C++ 風格
void Increment(int& r) { r++; } // 呼叫端:Increment(val); 更直觀

參考即別名,語意清晰,避免空指標解參風險。

5. 預設參數:彈性介面

void Log(const char* msg, int level = 0, const char* tag = "APP");
  • 所有預設參數必須集中在參數列右側
  • 虛函數預設參數由靜態型別決定 (靜態綁定),派生類覆寫時建議不重複預設值

6. 類別封裝:資料與操作合一

判斷「用函數」還是「用類別」的經驗法則:

  1. 多子程序共享資料 → 類別
  2. 單一子程序獨佔資料 → 函數 + 區域變數
  3. 同一子程序不同時期重用資料 → 函數 + static 區域變數
  4. 功能未來可能擴充/修改 → 類別 (支援繼承/多型)
  5. 衝突時以 (4) 為準

例:滑鼠驅動各子程序無共享資料 → 函數集;圖形物件 (資料) + 縮放/平移/旋轉 (操作) → 類別。

7. 模板與 BIDS (Borland International Data Structures)

早期 C++ Builder 透過模板提供型別安全容器:

typedef BI_StackAsVector IntStack;
IntStack stk;
for (int i=0; i<10; ++i) stk.push(i);
while (!stk.empty()) cout << stk.pop() << ' ';

現代替代:std::stack<int>, std::vector, std::list 等 STL 容器,標準化、無廠商鎖定、效能經實戰驗證。

總結:C++ 核心優勢

  • 零開銷抽象:inline、模板、參考
  • 資源管理自動化:RAII、智慧指標
  • 型別系統豐富:多載、模板、概念 (C++20)
  • 向後相容 C,平滑遷移

善用語言特性,寫出的 C++ 代碼比同功能 C 代碼更安全、更易維護、效能不遜色。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved