C++ 繁體中文教學網站
從入門到精通
專業的 C++ 繁體中文教學及練習範例網站,提供豐富的C++線上教學及自學資源,涵蓋C++入門基礎語法、基本架構到進階 OOP、STL、記憶體管理,配合豐富C++代碼程式範例與互動練習,讓你輕鬆掌握 C++ 程式設計!
📚 學習路徑總覽
按照順序學習,從基礎到進階,循序漸進掌握 C++
基礎入門
語法、輸出、輸入、註解
7 個章節變數與型別
變數、資料型別、常數、轉換
4 個章節運算子
算術、賦值、比較、邏輯、位元
5 個章節控制流程
條件判斷、switch、迴圈
5 個章節函數
函數、多載、遞迴、Lambda
4 個章節陣列與字串
陣列、多維陣列、字串操作
4 個章節指標與記憶體
指標、動態配置、智慧指標
4 個章節物件導向 OOP
類別、繼承、多型、封裝
6 個章節進階主題
STL、例外處理、樣板、檔案
5 個章節實戰專案
計算器、成績管理、鏈結串列
4 個章節🚀 C++ 簡介
C++ 是一種通用、高效能的程式語言,由 Bjarne Stroustrup 在 1980 年代初期開發,作為 C 語言的擴充版本。它結合了低階語言的效能與高階語言的抽象能力。
誕生年份
1983 年由 Bjarne Stroustrup 在貝爾實驗室開發
執行效能
接近硬體底層,執行速度極快,廣泛用於系統程式設計
跨平台
Windows、Linux、macOS 等平台皆可編譯執行
標準版本
C++11、C++14、C++17、C++20、C++23 持續演進
🎮 C++ 的應用領域
📊 C++ vs 其他語言比較
| 特性 | C++ | C | Java | Python |
|---|---|---|---|---|
| 執行速度 | ⚡ 極快 | ⚡ 極快 | 🔶 中等 | 🔴 較慢 |
| 物件導向 | ✅ 完整支援 | ❌ 不支援 | ✅ 完整支援 | ✅ 完整支援 |
| 記憶體管理 | 🔶 手動/智慧 | 🔶 手動 | ✅ 自動GC | ✅ 自動GC |
| 學習難度 | 🔴 較難 | 🔶 中等 | 🔶 中等 | ✅ 簡單 |
| 應用廣度 | ✅ 極廣 | 🔶 系統層 | ✅ 廣泛 | ✅ 廣泛 |
🧠 快速測驗
C++ 是由誰開發的?
🛠️ 環境搭建
在開始寫 C++ 程式之前,需要安裝編譯器和開發環境。以下介紹幾種常見的設定方式。
VS Code + MinGW 安裝步驟(Windows)
下載 MinGW-w64
前往 https://winlibs.com/ 下載最新的 MinGW-w64 壓縮包,解壓到 C:\mingw64
設定系統環境變數 PATH
將 C:\mingw64\bin 加入系統 PATH 環境變數中
驗證安裝
打開命令提示字元,輸入以下指令確認安裝成功:
g++ --version
# 輸出類似:g++ (GCC) 13.2.0
安裝 VS Code
前往 https://code.visualstudio.com/ 下載並安裝 VS Code
安裝 C/C++ 擴充套件
在 VS Code 中按 Ctrl+Shift+X,搜尋並安裝 C/C++(Microsoft)和 Code Runner 擴充套件
Visual Studio 安裝步驟(Windows)
下載 Visual Studio Community(免費版)
前往 https://visualstudio.microsoft.com/ 下載 Community 版
選擇工作負載
安裝時勾選 「使用 C++ 的桌面開發」 工作負載
建立新專案
開啟 VS,選擇「建立新專案」→「主控台應用程式」→「C++」
線上 C++ 編譯器(免安裝)
🌐 Compiler Explorer
godbolt.org — 可即時看到組合語言輸出
🌐 OnlineGDB
onlinegdb.com — 支援 debug 功能
🌐 Replit
replit.com — 支援多人協作
🌐 C++ Shell
cpp.sh — 輕量快速的線上編譯器
🧠 快速測驗
在 Windows 上要使用 VS Code 寫 C++,必須先安裝哪個編譯器?
👋 第一個程式:Hello World
按照傳統,學習任何程式語言的第一步就是輸出 "Hello, World!"。讓我們來分析這個經典程式的每一行。
📖 逐行解析
#include <iostream>
引入標準輸入輸出函式庫(iostream = input/output stream)。這讓我們可以使用 cout(輸出)和 cin(輸入)。
using namespace std;
告訴編譯器使用 std(standard)命名空間。沒有這行的話,需要寫 std::cout 而不是 cout。
int main() { ... }
主函數,程式的入口點。所有 C++ 程式都必須有一個 main 函數,程式從這裡開始執行。
cout << "Hello, World!" << endl;
cout 是輸出物件,<< 是插入運算子,endl 輸出換行並刷新緩衝區。
return 0;
主函數回傳 0 表示程式正常結束。非 0 值通常表示錯誤。
🔧 編譯與執行方式
# 編譯指令
g++ hello_world.cpp -o hello_world
# 執行程式(Windows)
hello_world.exe
# 執行程式(Linux/Mac)
./hello_world
# 編譯並立即執行(一行指令)
g++ hello_world.cpp -o hello && ./hello
cout 和 Cout 是不同的。每個陳述式必須以分號 ; 結尾。🧠 快速測驗
C++ 程式執行的入口點函數名稱是什麼?
📐 基本語法
🔑 語法規則整理
分號結尾
每個陳述式必須以 ; 結尾,少了分號會造成編譯錯誤。
大括號區塊
函數、迴圈、條件的主體用 {} 包圍,代表一個程式區塊。
大小寫敏感
myVar 和 MyVar 是不同的變數,C++ 嚴格區分大小寫。
空白忽略
多餘的空格、換行不影響程式執行,但好的縮排讓代碼更易讀。
⛔ 常見語法錯誤 vs ✅ 正確寫法
🧠 快速測驗
下列哪個陳述是正確的?
📤 輸出 (cout)
cout 是 C++ 標準輸出串流,用於在螢幕上顯示資料。cout 搭配插入運算子 << 使用。
🔤 轉義字元(Escape Characters)
| 轉義字元 | 說明 | 範例 |
|---|---|---|
\n | 換行 | cout << "第一行\n第二行"; |
\t | 水平 Tab | cout << "名字\t年齡"; |
\\ | 反斜線 | cout << "C:\\Users"; |
\" | 雙引號 | cout << "他說\"你好\""; |
\0 | 空字元 | 字串結尾標記 |
endl 除了換行外還會刷新輸出緩衝區,所以比 \n 稍慢。在大量輸出時建議使用 \n。🧠 快速測驗
以下哪個代碼能正確輸出兩行文字?
📥 輸入 (cin)
cin 是 C++ 標準輸入串流,搭配提取運算子 >> 讀取使用者輸入。
cin 會在空格處停止。若要讀取整行文字,應使用 getline(cin, str)。
🧠 快速測驗
要讀取含有空格的整行字串,應該使用哪個函數?
📦 變數(Variables)
變數是用來儲存資料的容器。在 C++ 中,每個變數都必須宣告其資料型別。
📏 命名規則
- 字母(a-z, A-Z)、數字(0-9)、底線(_)
- 必須以字母或底線開頭
- 例:
myVariable、_count、score2
- 以數字開頭(
2myVar❌) - 包含空格(
my variable❌) - 使用 C++ 關鍵字(
int、class等) - 包含特殊符號(
@、#、$❌)
🎨 命名慣例(Naming Conventions)
| 風格 | 範例 | 常用於 |
|---|---|---|
| camelCase | myVariableName | 變數、函數名(最常用) |
| PascalCase | MyClassName | 類別名稱 |
| snake_case | my_variable_name | 部分 C 風格代碼 |
| UPPER_CASE | MAX_VALUE | 常數 |
🧠 快速測驗
下列哪個是合法的 C++ 變數名稱?
🗂️ 資料型別(Data Types)
| 型別 | 大小 | 範圍 | 範例 |
|---|---|---|---|
int | 4 bytes | -2,147,483,648 到 2,147,483,647 | int x = 42; |
long long | 8 bytes | 約 ±9.2 × 10¹⁸ | long long x = 9999999999LL; |
float | 4 bytes | 約 ±3.4 × 10³⁸(7位精度) | float f = 3.14f; |
double | 8 bytes | 約 ±1.8 × 10³⁰⁸(15位精度) | double d = 3.14159; |
char | 1 byte | -128 到 127 | char c = 'A'; |
bool | 1 byte | true 或 false | bool b = true; |
string | 動態 | 任意長度字串 | string s = "Hello"; |
void | 0 bytes | 無型別 | 函數回傳型別 |
double(雙精度),若要用 float(單精度)需在數字後加 f,如 3.14f。🧠 快速測驗
在 C++ 中,bool 型別佔用多少 bytes?
🔒 常數(Constants)
⚖️ const vs #define 比較
| 特性 | const | #define |
|---|---|---|
| 型別安全 | ✅ 有型別檢查 | ❌ 無型別 |
| 調試顯示 | ✅ 可在調試器中看到 | ❌ 預處理替換,無法看到 |
| 作用域 | ✅ 遵循作用域規則 | ❌ 全域替換 |
| 記憶體 | 🔶 佔記憶體 | ✅ 不佔記憶體(文字替換) |
| 建議使用 | ✅ 推薦(C++ 風格) | ⚠️ 不建議(C 風格) |
🧠 快速測驗
在 C++ 中,宣告常數的建議方式是?
🔄 型別轉換(Type Casting)
double 轉換為 int 時,小數部分會被截斷(不是四捨五入!)。例如 (int)9.99 結果是 9,而非 10。🧠 快速測驗
(int)9.99 的結果是?
➕ 算術運算子
| 運算子 | 名稱 | 範例 | 結果 |
|---|---|---|---|
+ | 加法 | 10 + 3 | 13 |
- | 減法 | 10 - 3 | 7 |
* | 乘法 | 10 * 3 | 30 |
/ | 除法 | 10 / 3 | 3(整數除法) |
% | 取餘數(模) | 10 % 3 | 1 |
++ | 遞增 | x++ 或 ++x | x+1 |
-- | 遞減 | x-- 或 --x | x-1 |
🧠 快速測驗
17 % 5 的結果是?
📝 賦值運算子
| 運算子 | 等同於 | 範例 |
|---|---|---|
= | x = x | x = 5 |
+= | x = x + n | x += 3 → x = x+3 |
-= | x = x - n | x -= 3 → x = x-3 |
*= | x = x * n | x *= 3 → x = x*3 |
/= | x = x / n | x /= 3 → x = x/3 |
%= | x = x % n | x %= 3 → x = x%3 |
🧠 快速測驗
若 x = 10,執行 x *= 3 後,x 的值是?
🔍 比較運算子
| 運算子 | 名稱 | 範例 | 結果 |
|---|---|---|---|
== | 等於 | 5 == 5 | true |
!= | 不等於 | 5 != 3 | true |
> | 大於 | 5 > 3 | true |
< | 小於 | 3 < 5 | true |
>= | 大於等於 | 5 >= 5 | true |
<= | 小於等於 | 3 <= 5 | true |
🧠 快速測驗
5 != 5 的結果是?
🧮 邏輯運算子
📊 真值表
&& (AND)
| A | B | A && B |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
|| (OR)
| A | B | A || B |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
! (NOT)
| A | !A |
|---|---|
| true | false |
| false | true |
🧠 快速測驗
true && false || true 的結果是?
🔢 位元運算子
| 運算子 | 名稱 | 說明 | 範例(a=5, b=3) |
|---|---|---|---|
& | AND | 兩位都為1才得1 | 5 & 3 = 1 (0101 & 0011) |
| | OR | 有一位為1就得1 | 5 | 3 = 7 (0101 | 0011) |
^ | XOR | 兩位不同才得1 | 5 ^ 3 = 6 (0101 ^ 0011) |
~ | NOT | 位元反轉 | ~5 = -6 |
<< | 左移 | 向左移n位(乘2^n) | 5 << 1 = 10 |
>> | 右移 | 向右移n位(除2^n) | 5 >> 1 = 2 |
🧠 快速測驗
4 << 1 的結果是?
🔀 if...else 條件判斷
條件 ? 值A : 值B 是 if-else 的簡化寫法,適合簡單的條件賦值。🧠 快速測驗
int x = (10 > 5) ? 100 : 200; 執行後 x 的值是?
🔄 switch 語句
break 結尾,否則會繼續執行下一個 case(稱為「fall-through」)。default 是當沒有任何 case 匹配時執行的代碼。🧠 快速測驗
在 switch 語句中,若省略 break,會發生什麼?
🔁 while 迴圈
🧠 快速測驗
do-while 迴圈與 while 迴圈的主要區別是?
🔂 for 迴圈
🧠 快速測驗
for (int i = 0; i < 5; i++) 迴圈執行幾次?
🔄 範圍 for 迴圈(C++11)
auto& 引用型別;若只是讀取,使用 const auto& 更安全。🧠 快速測驗
要用範圍 for 迴圈修改陣列中的元素,應該怎麼宣告迴圈變數?
🔧 函數基礎(Functions)
🧠 快速測驗
使用傳參考(pass by reference)與傳值(pass by value)的主要區別是?
🎭 函數多載(Function Overloading)
函數多載允許同一個函數名稱有不同的參數型別或數量。C++ 根據呼叫時傳入的參數自動選擇對應的函數版本。
🧠 快速測驗
函數多載(Overloading)的判斷依據是?
🔁 遞迴函數(Recursion)
遞迴是函數呼叫自身的技術。每個遞迴函數必須有:1. 基底條件(Base Case)以停止遞迴,2. 遞迴呼叫以逐步接近基底條件。
🧠 快速測驗
遞迴函數必須要有什麼才能避免無窮遞迴?
λ Lambda 函數(C++11)
Lambda 表達式是可以在代碼中直接定義的匿名函數,非常適合用於回呼函數和 STL 演算法。
🧠 快速測驗
Lambda 表達式中,[&] 表示什麼?
📋 陣列(Arrays)
🧠 快速測驗
宣告 int arr[5] = {1,2,3,4,5};,arr[2] 的值是?
🧮 多維陣列
🧠 快速測驗
int m[3][4] 代表幾行幾列的矩陣?
📝 字串(string 類別)
📚 常用 string 方法
| 方法 | 說明 | 範例 |
|---|---|---|
length() / size() | 取得字串長度 | s.length() |
append() | 附加字串 | s.append(" world") |
find() | 搜尋子字串位置 | s.find("lo") |
substr() | 取子字串 | s.substr(0, 5) |
replace() | 替換子字串 | s.replace(0, 5, "Hi") |
empty() | 是否為空 | s.empty() |
erase() | 刪除字元 | s.erase(0, 3) |
compare() | 比較字串 | s.compare("hello") |
🧠 快速測驗
string s = "Hello"; s.substr(1, 3); 回傳什麼?
🔡 C 風格字串
⚖️ string vs C 風格字串
| 特性 | std::string | char[](C 風格) |
|---|---|---|
| 易用性 | ✅ 簡單直覺 | ❌ 需手動處理 |
| 安全性 | ✅ 自動管理記憶體 | ❌ 容易溢位 |
| 效能 | 🔶 稍有開銷 | ✅ 接近底層 |
| 建議使用 | ✅ C++ 中優先使用 | 🔶 與 C 介接時使用 |
🧠 快速測驗
在現代 C++ 中,哪種字串方式更被推薦使用?
🎯 指標基礎(Pointers)
指標是儲存記憶體位址的變數。這是 C++ 最強大也最容易出錯的特性之一。
1. 空指標解參考(Null pointer dereference)
2. 懸空指標(Dangling pointer)
3. 記憶體洩漏(Memory leak)
🧠 快速測驗
int* ptr = &x; 中,*ptr 表示什麼?
💾 動態記憶體(new / delete)
new 必須對應一個 delete,否則記憶體無法被釋放,長期運行的程式會耗盡記憶體。現代 C++ 建議使用智慧指標取代裸指標。🧠 快速測驗
使用 new[] 配置的陣列,應使用什麼釋放記憶體?
🧠 智慧指標(Smart Pointers)C++11
| 智慧指標 | 特性 | 使用時機 |
|---|---|---|
unique_ptr | 獨佔所有權,不可複製 | 單一擁有者,大多數情況 |
shared_ptr | 共享所有權,參考計數 | 多個物件共享同一資源 |
weak_ptr | 弱參考,不影響計數 | 打破循環參考 |
🧠 快速測驗
哪種智慧指標允許多個指標共享同一個物件的所有權?
🔗 參考(References)
⚖️ 參考 vs 指標
| 特性 | 參考 (&) | 指標 (*) |
|---|---|---|
| 初始化 | ✅ 宣告時必須初始化 | 🔶 可稍後初始化 |
| 可以為 null | ✅ 不能為 null | ❌ 可以為 null(需檢查) |
| 重新指向 | ❌ 一旦綁定不能改變 | ✅ 可以指向不同物件 |
| 語法 | ✅ 較簡潔,不需 * 或 & | ❌ 需要 * 解參考 |
| 算術運算 | ❌ 不支援 | ✅ 支援指標算術 |
🧠 快速測驗
關於 C++ 參考(reference),下列哪個說法是正確的?
🏗️ 類別與物件(Class & Object)
類別(Class)是物件的藍圖,定義了物件的屬性(成員變數)和行為(成員函數)。物件(Object)是類別的實例。
🧠 快速測驗
在 C++ 中,類別的建構子(Constructor)有什麼特點?
🔐 存取修飾詞(Access Modifiers)
| 修飾詞 | 類別內部 | 子類別 | 外部 |
|---|---|---|---|
public | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ❌ |
private | ✅ | ❌ | ❌ |
🧠 快速測驗
protected 成員可以被哪些存取?
🌳 繼承(Inheritance)
🧠 快速測驗
class Dog : public Animal 中,public 繼承代表什麼?
🦋 多型(Polymorphism)
🧠 快速測驗
在 C++ 中,要實現執行時多型(Runtime Polymorphism),必須使用什麼關鍵字?
🔒 封裝(Encapsulation)
🧠 快速測驗
封裝(Encapsulation)的主要目的是?
🎭 抽象類別(Abstract Class)
🧠 快速測驗
純虛擬函數的宣告語法是?
📚 STL 容器(Standard Template Library)
STL 是 C++ 標準庫中強大的泛型容器集合,提供了各種常用的資料結構。
📊 STL 容器選擇指南
| 容器 | 存取 | 插入/刪除 | 最適合用於 |
|---|---|---|---|
vector | O(1) 隨機 | 尾部 O(1),中間 O(n) | 動態陣列,大多數情況 |
list | O(n) 線性 | O(1) 任何位置 | 頻繁插入刪除 |
map | O(log n) | O(log n) | 鍵值對,需要排序 |
unordered_map | 平均 O(1) | 平均 O(1) | 鍵值對,不需排序 |
set | O(log n) | O(log n) | 唯一元素集合 |
stack | 只能存取頂部 | O(1) | LIFO 操作 |
queue | 只能存取頭尾 | O(1) | FIFO 操作 |
🧠 快速測驗
哪種 STL 容器會自動排序並去除重複元素?
🔍 迭代器(Iterators)
🧠 快速測驗
v.begin() 和 v.end() 分別指向哪裡?
⚠️ 例外處理(Exception Handling)
🧠 快速測驗
在 C++ 例外處理中,finally 區塊等效的機制是?
📋 樣板(Templates)
樣板讓你編寫與型別無關的泛型代碼,是 STL 的基礎。
🧠 快速測驗
函數樣板(Function Template)的主要優點是?
📁 檔案操作(File I/O)
🧠 快速測驗
要以附加模式(不覆蓋原有內容)開啟檔案,應使用哪個模式?
🧮 專案一:計算器程式
建立一個完整的四則運算計算器,支援整數和浮點數運算,並包含錯誤處理。
🎓 專案二:學生成績管理系統
🔗 專案三:自製鏈結串列
🏆 C++ 綜合小測驗
挑戰 10 題 C++ 綜合測驗,測試你的學習成果!每題 10 分,滿分 100 分。
C++ 中,int 型別在 32 位元系統上佔用多少 bytes?
下列哪個是正確的 C++ 指標宣告?
關於 C++ 虛擬函數(virtual function),下列何者正確?
vector<int> v = {3,1,4,1,5}; 執行 sort(v.begin(), v.end()); 後,v[0] 是?
C++ 中的 RAII 原則代表什麼?
下列代碼的輸出是什麼?int x = 5; cout << x++ << " " << ++x;
C++11 引入的 auto 關鍵字主要用於?
以下關於 struct 和 class 的差異,何者正確?
shared_ptr 底層使用什麼機制管理記憶體?
C++ 範本(Template)特化(Specialization)的目的是?
💬 註解(Comments)
註解是程式碼中不會被執行的文字,用來解釋代碼功能或暫時停用某段代碼。良好的註解習慣是專業程式設計師的重要特質。
📝 註解最佳實踐
好的註解
不好的註解
x = x + 1; // 把 x 加 1(重複代碼本身)🧠 快速測驗
下列哪個是正確的多行注释語法?