| C++ 特性 | C 語言替代方案 |
|---|---|
| `class` / 封裝/繼承/多態 | `struct` + 函數指針模擬 OOP / 純過程式設計 |
| `new` / `delete` | `malloc` / `free` (需強轉、檢查 NULL) |
| `iostream` / `cout` `cin` `<<` `>>` | `stdio.h` / `printf` `scanf` `%d` `%s` `%f` |
| `string` 類 | `char[]` / `char*` + `string.h` (`strcpy` `strlen` `strcmp`) |
| `vector`/`list`/`map` STL 容器 | 手寫動態數組/鏈表/哈希表 / 第三方庫 (CVector, uthash) |
| `bool` / `true` `false` | `int` / `1` `0` (C99 ` |
| 引用 `Type&` | 指針 `Type*` |
| 函數重載 / 默認參數 | 不同函數名 / 手動處理可選參數 |
| 命名空間 `namespace` | 前綴命名法 `Module_Function()` |
| 異常 `try/catch/throw` | 返回錯誤碼 / `setjmp`/`longjmp` / 全局錯誤變量 |
| 模板 `template` | 宏 `#define` / 類型特化函數 / `void*` 通用指針 |
| `const` 修飾變量 | `const` (C90+ 支持,但不可用於數組長度) |
| 內聯函數 `inline` | `inline` (C99 支持) / 宏 |
| 單行註釋 `//` | C99 支持,C89 僅 `/* */` |
| 變量聲明可延後 | C89 必須在塊開頭聲明,C99 可延後 |
// C++ 原始
class StudentManager {
vector students;
public:
void add(Student s) { students.push_back(s); }
void display() { for(auto& s: students) cout<
// C++
cout << "姓名: " << student.name << " 平均分: " << avg << endl;
cin >> name >> score;
// C
printf("姓名: %s 平均分: %.2f\n", student.name, avg);
scanf("%19s %f", name, &score); // %19s 防溢出
// C++
string name = "張三";
if (name == "李四") ...
// C
char name[20] = "張三";
if (strcmp(name, "李四") == 0) ... // strcmp 返回 0 表相等
strcpy(name, "李四"); // 賦值
// C++
bool flag = true;
if (flag) ...
// C (C89)
int flag = 1;
if (flag) ...
// C (C99 推薦)
#include
bool flag = true; // 實際是宏展開為 _Bool/1
// C++
Student* p = new Student();
delete p;
// C
Student* p = (Student*)malloc(sizeof(Student));
if (p == NULL) return; // 必須檢查
free(p);
p = NULL; // 防野指針
// C++
ofstream fout("data.txt");
fout << student.name << " " << student.score;
fout.close();
// C
FILE* fp = fopen("data.txt", "w");
if (fp) {
fprintf(fp, "%s %.2f", student.name, student.score);
fclose(fp);
}
// C 版主函數
int main() {
int choice;
while (1) {
printf("\n1.添加 2.顯示 3.查找 4.刪除 5.排序 6.保存 7.退出\n選擇: ");
if (scanf("%d", &choice) != 1) { scanf("%*s"); continue; }
switch (choice) {
case 1: inputStudent(); break;
case 2: displayStudents(); break;
case 3: searchStudent(); break;
case 4: deleteStudent(); break;
case 5: sortStudents(); break;
case 6: saveToFile(); break;
case 7: return 0;
default: printf("無效\n");
}
}
}
C++ 轉 C 核心是 **「去特性、留邏輯」**:用結構體+函數替代類、用格式化輸入輸出替代流、用手動內存管理替代 new/delete、用錯誤碼替代異常。**C99 標準 (`stdbool.h`、`inline`、`//`、變量延後聲明) 大幅縮小差距**。遷移時保持業務邏輯不變,逐模塊替換語法設施,充分測試邊界條件 (內存、字符串、文件)。