「類 C 語言」非官方標準,**源於大學《資料結構》課程教學需求**:
| 保留 C 核心 | 引入 C++ 特性 | 移除/不教 C++ 特性 |
|---|---|---|
| 基本型別、運算子、控制流、函式、陣列、指標、結構體、聯合、位欄、巨集、前置處理、標準庫 (stdio/stdlib/string/math/assert/errno/stddef/stdint/stdbool) | 參考型別 (`T&`) — 函式參數傳遞、避免指標滿天飛 函式多載 — `push(int)`/`push(double)`/`push(Node*)` 預設參數 — `void init(int size=100)` 命名空間 — `namespace ds { ... }` 避免全域污染 `new`/`delete` — 替代 `malloc`/`free`,型別安全、建構子/解構子 (僅用於簡單 RAII) `const` 語義增強 — 替代巨集常數、編譯期常數 單行註解 `//` | 類別/繼承/多型/虛函式 模板/STL 容器/演算法/迭代器 運算子多載 異常處理 (`try`/`catch`/`throw`) RTTI (`dynamic_cast`/`typeid`) 多重繼承/虛繼承 Lambda/自動型別推導 (C++11+) 智慧指標/執行緒/原子操作/模組 |
// 純 C (C99) - 泛型靠 void* + 函式指標,冗長且不安全
typedef struct { void *data; size_t size; size_t capacity; void (*free)(void*); } Vector;
void vector_push(Vector *v, void *elem) { ... }
void vector_destroy(Vector *v) { if (v->free) for (i) v->free(v->data[i]); free(v->data); }
// 類 C 語言 - 有 new/delete、參考、多載、命名空間,乾淨許多
namespace ds {
template <typename T> // 其實教學常「手寫多載版」而非真模板
struct Vector {
T *data; size_t size, cap;
Vector() : data(nullptr), size(0), cap(0) {}
~Vector() { delete[] data; }
void push(const T& v) { if (size==cap) reserve(cap?cap*2:4); data[size++]=v; }
T& operator[](size_t i) { return data[i]; }
size_t length() const { return size; }
};
}
// 使用
ds::Vector<int> v; v.push(1); v.push(2); int x = v[0];
註:許多教材為避開模板複雜度,**實際只教「針對 int/double/Node* 手寫多載版 Vector」**,這就是最純粹的「類 C 語言」。
| 優點 | 缺點 |
|---|---|
| 降低認知負荷:一學期可講完資料結構核心 + 語法 | 非標準方言:無編譯器支援,需人為約束「只用這些特性」 |
| 避開 C 指標/void* 地獄,引入參考/多載/RAII 基礎 | 易養成「C++ 寫法但無類別/模板/STL」怪習慣,轉正規 C++ 時需重構思維 |
| 為後續學完整 C++ 鋪路 (參考/RAII/命名空間已熟) | 業界無此方言,簡歷寫「熟悉類 C 語言」無意義 |
| 適合考試/作業自動評分 (特性固定、易靜態檢查) | 掩蓋了 C++ 真正威力 (泛型程式設計、STL、元編程、概念) |
「類 C 語言」是**教學場合的臨時妥協**,非生產環境方言。學生應視其為「C++ 入門坡道」,快速跨越、轉向現代 C++ 與純 C 雙軌並行,才是長久之計。