🚀 C++完整學習指南 · 繁體中文 | 香港編程學院 | C++課程

C++ 繁體中文教學網站
從入門到精通

專業的 C++ 繁體中文教學及練習範例網站,提供豐富的C++線上教學及自學資源,涵蓋C++入門基礎語法、基本架構到進階 OOP、STL、記憶體管理,配合豐富C++代碼程式範例與互動練習,讓你輕鬆掌握 C++ 程式設計!

48章節
200+代碼範例
10實戰專案
FREE完全免費
hello_world.cpp

      

📚 學習路徑總覽

按照順序學習,從基礎到進階,循序漸進掌握 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++ 的應用領域

🎮 遊戲開發 Unreal Engine、Unity(C# 底層 C++)、AAA 遊戲
💻 作業系統 Windows、Linux 核心、macOS 部分組件
🤖 嵌入式系統 Arduino、汽車電腦、IoT 設備
🌐 網頁瀏覽器 Chrome、Firefox、Safari 的核心引擎
🧠 人工智慧 TensorFlow、PyTorch 底層用 C++ 實現
📡 金融系統 高頻交易系統、銀行核心系統

📊 C++ vs 其他語言比較

特性 C++ C Java Python
執行速度⚡ 極快⚡ 極快🔶 中等🔴 較慢
物件導向✅ 完整支援❌ 不支援✅ 完整支援✅ 完整支援
記憶體管理🔶 手動/智慧🔶 手動✅ 自動GC✅ 自動GC
學習難度🔴 較難🔶 中等🔶 中等✅ 簡單
應用廣度✅ 極廣🔶 系統層✅ 廣泛✅ 廣泛
💡
學習建議:C++ 雖然學習曲線較陡,但掌握後對理解其他語言底層原理非常有幫助。建議從基礎語法開始,循序漸進。

🧠 快速測驗

C++ 是由誰開發的?

🛠️ 環境搭建

在開始寫 C++ 程式之前,需要安裝編譯器和開發環境。以下介紹幾種常見的設定方式。

VS Code + MinGW 安裝步驟(Windows)

1

下載 MinGW-w64

前往 https://winlibs.com/ 下載最新的 MinGW-w64 壓縮包,解壓到 C:\mingw64

2

設定系統環境變數 PATH

C:\mingw64\bin 加入系統 PATH 環境變數中

3

驗證安裝

打開命令提示字元,輸入以下指令確認安裝成功:

Terminal
g++ --version
# 輸出類似:g++ (GCC) 13.2.0
4

安裝 VS Code

前往 https://code.visualstudio.com/ 下載並安裝 VS Code

5

安裝 C/C++ 擴充套件

在 VS Code 中按 Ctrl+Shift+X,搜尋並安裝 C/C++(Microsoft)和 Code Runner 擴充套件

Visual Studio 安裝步驟(Windows)

1

下載 Visual Studio Community(免費版)

前往 https://visualstudio.microsoft.com/ 下載 Community 版

2

選擇工作負載

安裝時勾選 「使用 C++ 的桌面開發」 工作負載

3

建立新專案

開啟 VS,選擇「建立新專案」→「主控台應用程式」→「C++」

線上 C++ 編譯器(免安裝)

🌐 Compiler Explorer

godbolt.org — 可即時看到組合語言輸出

🌐 OnlineGDB

onlinegdb.com — 支援 debug 功能

🌐 Replit

replit.com — 支援多人協作

🌐 C++ Shell

cpp.sh — 輕量快速的線上編譯器

💡
推薦:初學者可先使用線上編譯器快速上手,不需安裝任何軟體即可開始寫 C++。

🧠 快速測驗

在 Windows 上要使用 VS Code 寫 C++,必須先安裝哪個編譯器?

👋 第一個程式:Hello World

按照傳統,學習任何程式語言的第一步就是輸出 "Hello, World!"。讓我們來分析這個經典程式的每一行。

C++hello_world.cpp
📤 執行輸出:
Hello, World! 歡迎來到 C++ 的世界!

📖 逐行解析

#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 值通常表示錯誤。

🔧 編譯與執行方式

Terminal
# 編譯指令
g++ hello_world.cpp -o hello_world

# 執行程式(Windows)
hello_world.exe

# 執行程式(Linux/Mac)
./hello_world

# 編譯並立即執行(一行指令)
g++ hello_world.cpp -o hello && ./hello
⚠️
注意:C++ 是大小寫敏感的語言!coutCout 是不同的。每個陳述式必須以分號 ; 結尾。

🧠 快速測驗

C++ 程式執行的入口點函數名稱是什麼?

📐 基本語法

C++syntax_demo.cpp

🔑 語法規則整理

分號結尾

每個陳述式必須以 ; 結尾,少了分號會造成編譯錯誤。

{ }

大括號區塊

函數、迴圈、條件的主體用 {} 包圍,代表一個程式區塊。

Aa

大小寫敏感

myVarMyVar 是不同的變數,C++ 嚴格區分大小寫。

空白忽略

多餘的空格、換行不影響程式執行,但好的縮排讓代碼更易讀。

⛔ 常見語法錯誤 vs ✅ 正確寫法

❌ 錯誤寫法
錯誤
✅ 正確寫法
正確

🧠 快速測驗

下列哪個陳述是正確的?

📤 輸出 (cout)

cout 是 C++ 標準輸出串流,用於在螢幕上顯示資料。cout 搭配插入運算子 << 使用。

C++cout_demo.cpp
📤 執行輸出:
這是一段文字 數字:42 浮點數:3.14 字元:A 布林值:1 連續輸出:Hello World 這是第一行 這是第二行(用 \n 換行)

🔤 轉義字元(Escape Characters)

轉義字元說明範例
\n換行cout << "第一行\n第二行";
\t水平 Tabcout << "名字\t年齡";
\\反斜線cout << "C:\\Users";
\"雙引號cout << "他說\"你好\"";
\0空字元字串結尾標記
C++escape_chars.cpp
📤 執行輸出:
姓名 年齡 成績 Alice 20 95 Bob 22 88 路徑:C:\Program Files\MyApp 他說:"C++ 很好學!"
ℹ️
endl vs \n:endl 除了換行外還會刷新輸出緩衝區,所以比 \n 稍慢。在大量輸出時建議使用 \n

🧠 快速測驗

以下哪個代碼能正確輸出兩行文字?

📥 輸入 (cin)

cin 是 C++ 標準輸入串流,搭配提取運算子 >> 讀取使用者輸入。

C++cin_demo.cpp
📤 執行輸出(使用者輸入 Alice 和 20):
請輸入您的姓名:Alice 請輸入您的年齡:20 您好,Alice!您今年 20 歲。
C++cin_multiple.cpp
📤 執行輸出:
請輸入兩個整數(用空格分隔):10 25 兩數之和:35 兩數之積:250
⚠️
注意:當讀取含空格的字串時,cin 會在空格處停止。若要讀取整行文字,應使用 getline(cin, str)
C++getline_demo.cpp
📤 執行輸出:
請輸入您的全名:張 小明 您的全名是:張 小明

🧠 快速測驗

要讀取含有空格的整行字串,應該使用哪個函數?

💬 註解(Comments)

註解是程式碼中不會被執行的文字,用來解釋代碼功能或暫時停用某段代碼。良好的註解習慣是專業程式設計師的重要特質。

C++comments_demo.cpp
📤 執行輸出:
圓的面積:78.5398 圓的周長:31.4159

📝 註解最佳實踐

好的註解

  • 說明「為什麼」這樣做,而非「做什麼」(代碼本身說明做什麼)
  • 函數前說明功能、參數、回傳值
  • 複雜演算法步驟說明

不好的註解

  • x = x + 1; // 把 x 加 1(重複代碼本身)
  • 過時的註解(與代碼不符)
  • 無意義的日期/修改記錄(應用版本控制)

🧠 快速測驗

下列哪個是正確的多行注释語法?

📦 變數(Variables)

變數是用來儲存資料的容器。在 C++ 中,每個變數都必須宣告其資料型別。

C++variables_demo.cpp
📤 執行輸出:
學生姓名:Alice 年齡:20 身高:165.5 公分 成績:A 是否通過:1 x=5, y=10, z=15

📏 命名規則

✅ 允許
  • 字母(a-z, A-Z)、數字(0-9)、底線(_)
  • 必須以字母或底線開頭
  • 例:myVariable_countscore2
❌ 不允許
  • 以數字開頭(2myVar ❌)
  • 包含空格(my variable ❌)
  • 使用 C++ 關鍵字(intclass 等)
  • 包含特殊符號(@#$ ❌)

🎨 命名慣例(Naming Conventions)

風格範例常用於
camelCasemyVariableName變數、函數名(最常用)
PascalCaseMyClassName類別名稱
snake_casemy_variable_name部分 C 風格代碼
UPPER_CASEMAX_VALUE常數

🧠 快速測驗

下列哪個是合法的 C++ 變數名稱?

🗂️ 資料型別(Data Types)

型別大小範圍範例
int4 bytes-2,147,483,648 到 2,147,483,647int x = 42;
long long8 bytes約 ±9.2 × 10¹⁸long long x = 9999999999LL;
float4 bytes約 ±3.4 × 10³⁸(7位精度)float f = 3.14f;
double8 bytes約 ±1.8 × 10³⁰⁸(15位精度)double d = 3.14159;
char1 byte-128 到 127char c = 'A';
bool1 bytetrue 或 falsebool b = true;
string動態任意長度字串string s = "Hello";
void0 bytes無型別函數回傳型別
C++datatypes_demo.cpp
📤 執行輸出:
int 大小: 4 bytes double 大小: 8 bytes float 大小: 4 bytes char 大小: 1 bytes bool 大小: 1 bytes long long 大小: 8 bytes 最大整數: 2147483647 最小整數: -2147483648
💡
小技巧:浮點數預設用 double(雙精度),若要用 float(單精度)需在數字後加 f,如 3.14f

🧠 快速測驗

在 C++ 中,bool 型別佔用多少 bytes?

🔒 常數(Constants)

C++constants_demo.cpp

⚖️ const vs #define 比較

特性const#define
型別安全✅ 有型別檢查❌ 無型別
調試顯示✅ 可在調試器中看到❌ 預處理替換,無法看到
作用域✅ 遵循作用域規則❌ 全域替換
記憶體🔶 佔記憶體✅ 不佔記憶體(文字替換)
建議使用✅ 推薦(C++ 風格)⚠️ 不建議(C 風格)

🧠 快速測驗

在 C++ 中,宣告常數的建議方式是?

🔄 型別轉換(Type Casting)

C++typecast_demo.cpp
📤 執行輸出:
隱式轉換:整數 7 轉為 double = 7 除法結果(整除):3 除法結果(正確):3.33333 ASCII 碼:A = 65 字元:65 = A static_cast 示範:9.99 轉 int = 9
⚠️
精度損失警告:double 轉換為 int 時,小數部分會被截斷(不是四捨五入!)。例如 (int)9.99 結果是 9,而非 10

🧠 快速測驗

(int)9.99 的結果是?

➕ 算術運算子

運算子名稱範例結果
+加法10 + 313
-減法10 - 37
*乘法10 * 330
/除法10 / 33(整數除法)
%取餘數(模)10 % 31
++遞增x++++xx+1
--遞減x----xx-1
C++arithmetic_demo.cpp
📤 執行輸出:
a + b = 13 a - b = 7 a * b = 30 a / b = 3 (整數除法,小數被捨去) a % b = 1 (10 除以 3 的餘數) 10.0 / 3 = 3.33333 前置遞增 (++x): 6 後置遞增 (x++): 6 -> 7 判斷奇偶:15 % 2 = 1 → 奇數

🧠 快速測驗

17 % 5 的結果是?

📝 賦值運算子

運算子等同於範例
=x = xx = 5
+=x = x + nx += 3 → x = x+3
-=x = x - nx -= 3 → x = x-3
*=x = x * nx *= 3 → x = x*3
/=x = x / nx /= 3 → x = x/3
%=x = x % nx %= 3 → x = x%3
C++assign_demo.cpp

🧠 快速測驗

x = 10,執行 x *= 3 後,x 的值是?

🔍 比較運算子

運算子名稱範例結果
==等於5 == 5true
!=不等於5 != 3true
>大於5 > 3true
<小於3 < 5true
>=大於等於5 >= 5true
<=小於等於3 <= 5true
C++compare_demo.cpp

🧠 快速測驗

5 != 5 的結果是?

🧮 邏輯運算子

C++logical_demo.cpp

📊 真值表

&& (AND)

ABA && B
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

|| (OR)

ABA || B
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

! (NOT)

A!A
truefalse
falsetrue

🧠 快速測驗

true && false || true 的結果是?

🔢 位元運算子

運算子名稱說明範例(a=5, b=3)
&AND兩位都為1才得15 & 3 = 1 (0101 & 0011)
|OR有一位為1就得15 | 3 = 7 (0101 | 0011)
^XOR兩位不同才得15 ^ 3 = 6 (0101 ^ 0011)
~NOT位元反轉~5 = -6
<<左移向左移n位(乘2^n)5 << 1 = 10
>>右移向右移n位(除2^n)5 >> 1 = 2
C++bitwise_demo.cpp

🧠 快速測驗

4 << 1 的結果是?

🔀 if...else 條件判斷

C++ifelse_demo.cpp
📤 執行輸出(score=85):
成績等級:B(良好) 85 是奇數嗎?否,85 是奇數 三元運算子結果:85 >= 60,通過! 最大值:20
💡
三元運算子:條件 ? 值A : 值B 是 if-else 的簡化寫法,適合簡單的條件賦值。

🧠 快速測驗

int x = (10 > 5) ? 100 : 200; 執行後 x 的值是?

🔄 switch 語句

C++switch_demo.cpp
📤 執行輸出:
今天是:三 今天是平日 季節是:春天
⚠️
別忘了 break!每個 case 必須以 break 結尾,否則會繼續執行下一個 case(稱為「fall-through」)。default 是當沒有任何 case 匹配時執行的代碼。

🧠 快速測驗

在 switch 語句中,若省略 break,會發生什麼?

🔁 while 迴圈

C++while_demo.cpp
📤 執行輸出:
while 迴圈: 計數: 1 計數: 2 計數: 3 計數: 4 計數: 5 --- do-while 迴圈(先執行後判斷): 執行了! 次數: 1 執行了! 次數: 2 執行了! 次數: 3
⚠️
無窮迴圈警告:確保迴圈條件最終會變為 false,否則會造成無窮迴圈,程式將永遠執行。

🧠 快速測驗

do-while 迴圈與 while 迴圈的主要區別是?

🔂 for 迴圈

C++for_demo.cpp
📤 執行輸出:
基本 for 迴圈 1 到 5: 1 2 3 4 5 九九乘法表(部分): 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 3 x 1 = 3 3 x 2 = 6 3 x 3 = 9 break/continue 示範: 1 2 3 4 (跳過5繼續) 6 7 8 9 10

🧠 快速測驗

for (int i = 0; i < 5; i++) 迴圈執行幾次?

🔄 範圍 for 迴圈(C++11)

C++rangefor_demo.cpp
📤 執行輸出:
遍歷陣列: 10 20 30 40 50 遍歷字串字元: H e l l o vector 遍歷: 蘋果 香蕉 芒果 修改陣列(加倍): 20 40 60 80 100
💡
C++11 特性:範圍 for 迴圈讓遍歷更簡潔。若要修改元素,使用 auto& 引用型別;若只是讀取,使用 const auto& 更安全。

🧠 快速測驗

要用範圍 for 迴圈修改陣列中的元素,應該怎麼宣告迴圈變數?

🔧 函數基礎(Functions)

C++functions_demo.cpp
📤 執行輸出:
打招呼:你好! 加法結果:15 5 的平方:25 最大值:20 傳值 vs 傳參考: 傳值後,原始 a = 5(未改變) 傳參考後,原始 b = 15(已改變)

🧠 快速測驗

使用傳參考(pass by reference)與傳值(pass by value)的主要區別是?

🎭 函數多載(Function Overloading)

函數多載允許同一個函數名稱有不同的參數型別或數量。C++ 根據呼叫時傳入的參數自動選擇對應的函數版本。

C++overload_demo.cpp
📤 執行輸出:
add(3, 4) = 7 add(3.5, 4.5) = 8 add(1, 2, 3) = 6 面積(圓形,r=5)= 78.5398 面積(矩形,3x4)= 12 面積(三角形,底5,高4)= 10

🧠 快速測驗

函數多載(Overloading)的判斷依據是?

🔁 遞迴函數(Recursion)

遞迴是函數呼叫自身的技術。每個遞迴函數必須有:1. 基底條件(Base Case)以停止遞迴,2. 遞迴呼叫以逐步接近基底條件。

C++recursion_demo.cpp
📤 執行輸出:
5! = 120 費氏數列前10項: 0 1 1 2 3 5 8 13 21 34 2的10次方 = 1024 漢諾塔(3個圓盤): 移動圓盤 1:A -> C 移動圓盤 2:A -> B 移動圓盤 1:C -> B 移動圓盤 3:A -> C 移動圓盤 1:B -> A 移動圓盤 2:B -> C 移動圓盤 1:A -> C

🧠 快速測驗

遞迴函數必須要有什麼才能避免無窮遞迴?

λ Lambda 函數(C++11)

Lambda 表達式是可以在代碼中直接定義的匿名函數,非常適合用於回呼函數和 STL 演算法。

C++lambda_demo.cpp
📤 執行輸出:
基本 lambda: 15 帶捕獲: 乘數倍: 30 排序後: 1 2 3 4 5 std::sort 搭配 lambda: [1, 2, 3, 4, 5] 過濾偶數: 2 4 6 8 10

🧠 快速測驗

Lambda 表達式中,[&] 表示什麼?

📋 陣列(Arrays)

C++arrays_demo.cpp
📤 執行輸出:
第一個元素: 10 最後一個元素: 50 所有元素: 10 20 30 40 50 總和: 150, 平均: 30 最大值: 95, 最小值: 45 排序後: 45 60 72 88 95

🧠 快速測驗

宣告 int arr[5] = {1,2,3,4,5};arr[2] 的值是?

🧮 多維陣列

C++multidim_demo.cpp
📤 執行輸出:
矩陣 A: 1 2 3 4 5 6 7 8 9 matrix[1][2] = 6 矩陣 B(轉置): 1 4 7 2 5 8 3 6 9

🧠 快速測驗

int m[3][4] 代表幾行幾列的矩陣?

📝 字串(string 類別)

C++strings_demo.cpp
📤 執行輸出:
字串長度: 5 連接結果: Hello, World! 子字串: ello 找到 'World' 在位置: 7 替換後: Hello, C++! 大寫: HELLO 轉換數字: 42 字串轉整數: 123 + 1 = 124

📚 常用 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 風格字串

C++cstrings_demo.cpp

⚖️ string vs C 風格字串

特性std::stringchar[](C 風格)
易用性✅ 簡單直覺❌ 需手動處理
安全性✅ 自動管理記憶體❌ 容易溢位
效能🔶 稍有開銷✅ 接近底層
建議使用✅ C++ 中優先使用🔶 與 C 介接時使用

🧠 快速測驗

在現代 C++ 中,哪種字串方式更被推薦使用?

🎯 指標基礎(Pointers)

指標是儲存記憶體位址的變數。這是 C++ 最強大也最容易出錯的特性之一。

C++pointers_demo.cpp
📤 執行輸出:
num 的值: 42 num 的位址: 0x7ffd5e3a2b4c (每次執行不同) ptr 儲存的位址: 0x7ffd5e3a2b4c 透過指標取值: 42 透過指標修改後 num = 100 陣列指標: 10 20 30 40 50 指標運算: ptr+1 指向 20
⚠️
危險警告:指標操作需要特別小心,常見錯誤包括:
1. 空指標解參考(Null pointer dereference)
2. 懸空指標(Dangling pointer)
3. 記憶體洩漏(Memory leak)

🧠 快速測驗

int* ptr = &x; 中,*ptr 表示什麼?

💾 動態記憶體(new / delete)

C++dynamic_memory.cpp
⚠️
記憶體洩漏(Memory Leak):每個 new 必須對應一個 delete,否則記憶體無法被釋放,長期運行的程式會耗盡記憶體。現代 C++ 建議使用智慧指標取代裸指標。

🧠 快速測驗

使用 new[] 配置的陣列,應使用什麼釋放記憶體?

🧠 智慧指標(Smart Pointers)C++11

C++smart_pointers.cpp
智慧指標特性使用時機
unique_ptr獨佔所有權,不可複製單一擁有者,大多數情況
shared_ptr共享所有權,參考計數多個物件共享同一資源
weak_ptr弱參考,不影響計數打破循環參考

🧠 快速測驗

哪種智慧指標允許多個指標共享同一個物件的所有權?

🔗 參考(References)

C++references_demo.cpp

⚖️ 參考 vs 指標

特性參考 (&)指標 (*)
初始化✅ 宣告時必須初始化🔶 可稍後初始化
可以為 null✅ 不能為 null❌ 可以為 null(需檢查)
重新指向❌ 一旦綁定不能改變✅ 可以指向不同物件
語法✅ 較簡潔,不需 * 或 &❌ 需要 * 解參考
算術運算❌ 不支援✅ 支援指標算術

🧠 快速測驗

關於 C++ 參考(reference),下列哪個說法是正確的?

🏗️ 類別與物件(Class & Object)

類別(Class)是物件的藍圖,定義了物件的屬性(成員變數)和行為(成員函數)。物件(Object)是類別的實例。

C++class_demo.cpp
📤 執行輸出:
建立汽車: Toyota Camry (2023) Toyota Camry 啟動了! 速度: 0 → 30 → 60 → 90 煞車: 90 → 60 Toyota Camry 已關閉 --- 建立學生: Alice, 20歲 Alice 的成績: 數學: 95 英文: 88 物理: 92 平均成績: 91.67

🧠 快速測驗

在 C++ 中,類別的建構子(Constructor)有什麼特點?

🔐 存取修飾詞(Access Modifiers)

C++access_demo.cpp
修飾詞類別內部子類別外部
public
protected
private

🧠 快速測驗

protected 成員可以被哪些存取?

🌳 繼承(Inheritance)

C++inheritance_demo.cpp
📤 執行輸出:
動物(基底類別): 小白 發出聲音 狗(子類別): 小白 汪汪叫!(繼承自動物) 貓(子類別): 小花 喵喵叫! 電話(基底類別): 撥打電話中... 照相機(基底類別): 拍照中... 智慧型手機(多重繼承): 撥打電話中... + 拍照中...

🧠 快速測驗

class Dog : public Animal 中,public 繼承代表什麼?

🦋 多型(Polymorphism)

C++polymorphism_demo.cpp
📤 執行輸出:
形狀計算: 圓形面積: 78.5398 矩形面積: 20 三角形面積: 6 --- 透過基底類別指標(多型): 圓形面積: 78.5398 矩形面積: 20 三角形面積: 6

🧠 快速測驗

在 C++ 中,要實現執行時多型(Runtime Polymorphism),必須使用什麼關鍵字?

🔒 封裝(Encapsulation)

C++encapsulation_demo.cpp

🧠 快速測驗

封裝(Encapsulation)的主要目的是?

🎭 抽象類別(Abstract Class)

C++abstract_demo.cpp

🧠 快速測驗

純虛擬函數的宣告語法是?

📚 STL 容器(Standard Template Library)

STL 是 C++ 標準庫中強大的泛型容器集合,提供了各種常用的資料結構。

C++stl_demo.cpp
📤 執行輸出:
vector: 10 20 30 40 50 vector 大小: 5 map 學生成績: Alice: 95 Bob: 88 Charlie: 92 set(自動排序去重): 1 2 3 4 5 queue(先進先出): 1 2 3 stack(後進先出): 3 2 1

📊 STL 容器選擇指南

容器存取插入/刪除最適合用於
vectorO(1) 隨機尾部 O(1),中間 O(n)動態陣列,大多數情況
listO(n) 線性O(1) 任何位置頻繁插入刪除
mapO(log n)O(log n)鍵值對,需要排序
unordered_map平均 O(1)平均 O(1)鍵值對,不需排序
setO(log n)O(log n)唯一元素集合
stack只能存取頂部O(1)LIFO 操作
queue只能存取頭尾O(1)FIFO 操作

🧠 快速測驗

哪種 STL 容器會自動排序並去除重複元素?

🔍 迭代器(Iterators)

C++iterators_demo.cpp

🧠 快速測驗

v.begin()v.end() 分別指向哪裡?

⚠️ 例外處理(Exception Handling)

C++exceptions_demo.cpp
📤 執行輸出:
100 / 4 = 25 錯誤:除數不能為零! 測試 out_of_range: 捕獲標準例外:vector::_M_range_check: __n (which is 10) >= this->size() (which is 3) 自訂例外: 捕獲自訂例外:[驗證錯誤] 年齡不能為負數:-5 finally 區塊(一定執行):清理資源中...

🧠 快速測驗

在 C++ 例外處理中,finally 區塊等效的機制是?

📋 樣板(Templates)

樣板讓你編寫與型別無關的泛型代碼,是 STL 的基礎。

C++templates_demo.cpp
📤 執行輸出:
maxValue(3, 7) = 7 maxValue(3.5, 2.1) = 3.5 maxValue('a', 'z') = z MyStack<int>: push 1,2,3 → pop: 3 2 1 MyStack<string>: push A,B,C → pop: C B A Pair<string, int>: Alice - 95

🧠 快速測驗

函數樣板(Function Template)的主要優點是?

📁 檔案操作(File I/O)

C++files_demo.cpp
📤 執行輸出:
成功寫入 output.txt 讀取 output.txt 內容: C++ 檔案操作範例 這是第二行 這是第三行 成功讀取 3 行 CSV 資料已儲存到 students.csv

🧠 快速測驗

要以附加模式(不覆蓋原有內容)開啟檔案,應使用哪個模式?

🧮 專案一:計算器程式

建立一個完整的四則運算計算器,支援整數和浮點數運算,並包含錯誤處理。

✅ 支援 +, -, *, / 四則運算
✅ 支援浮點數
✅ 除以零的錯誤處理
✅ 連續計算(迴圈)
✅ 無效輸入檢測
C++calculator.cpp
📤 示例互動:
===== C++ 計算器 ===== 輸入運算(例: 10 + 5)或 'q' 退出 > 10 + 5 結果:10 + 5 = 15 > 22.5 / 4 結果:22.5 / 4 = 5.625 > 7 / 0 錯誤:除數不能為零! > q 再見!

🎓 專案二:學生成績管理系統

✅ 結構體儲存學生資料
✅ 新增、顯示、搜尋學生
✅ 計算平均分
✅ 按成績排序
✅ 顯示不及格名單
C++student_manager.cpp
📤 執行輸出:
===== 學生成績管理系統 ===== 學生列表(依成績排序): 排名 姓名 數學 英文 物理 平均 1 Alice 95 88 92 91.67 2 Charlie 85 90 87 87.33 3 Diana 82 79 85 82.00 4 Bob 70 65 72 69.00 5 Eve 55 48 60 54.33 班級平均:76.87 不及格學生(平均低於60): Eve:54.33

🔗 專案三:自製鏈結串列

✅ 節點結構體定義
✅ 在頭部/尾部插入
✅ 刪除指定節點
✅ 搜尋節點
✅ 反轉鏈結串列
C++linked_list.cpp
📤 執行輸出:
建立鏈結串列: 1 → 2 → 3 → 4 → 5 → NULL 在頭部插入 0: 0 → 1 → 2 → 3 → 4 → 5 → NULL 刪除節點 3: 0 → 1 → 2 → 4 → 5 → NULL 搜尋 4:找到! 反轉後: 5 → 4 → 2 → 1 → 0 → NULL 串列長度: 5

🏆 C++ 綜合小測驗

挑戰 10 題 C++ 綜合測驗,測試你的學習成果!每題 10 分,滿分 100 分。

得分: 0 / 100
第 1 題

C++ 中,int 型別在 32 位元系統上佔用多少 bytes?

int 在大多數系統上佔 4 bytes(32 bits),範圍約 ±21億。
第 2 題

下列哪個是正確的 C++ 指標宣告?

指標宣告語法:型別* 指標名 = &變數; 其中 & 是取址運算子。
第 3 題

關於 C++ 虛擬函數(virtual function),下列何者正確?

virtual 關鍵字讓函數在繼承體系中可被覆寫(override),實現執行時多型(Runtime Polymorphism)。
第 4 題

vector<int> v = {3,1,4,1,5}; 執行 sort(v.begin(), v.end()); 後,v[0] 是?

sort() 預設升序排列,{3,1,4,1,5} 排序後變為 {1,1,3,4,5},所以 v[0] = 1。
第 5 題

C++ 中的 RAII 原則代表什麼?

RAII 是 C++ 的重要設計原則:資源在物件建構時獲取,在析構時釋放,確保資源不洩漏。
第 6 題

下列代碼的輸出是什麼?
int x = 5; cout << x++ << " " << ++x;

x++ 先輸出 5,再將 x 變成 6;然後 ++x 先將 x 從 6 變成 7 再輸出 7。所以輸出 "5 7"。
第 7 題

C++11 引入的 auto 關鍵字主要用於?

C++11 的 auto 讓編譯器根據初始值自動推導型別,如 auto x = 42; 編譯器推導 x 為 int。
第 8 題

以下關於 structclass 的差異,何者正確?

在 C++ 中,struct 和 class 唯一的區別是預設存取權限:struct 預設 public,class 預設 private。
第 9 題

shared_ptr 底層使用什麼機制管理記憶體?

shared_ptr 使用參考計數:每次複製指標計數+1,每次銷毀計數-1,計數歸零時自動釋放記憶體。
第 10 題

C++ 範本(Template)特化(Specialization)的目的是?

樣板特化允許為特定型別提供不同的實作,例如 vector<bool> 就是特化版本,採用位元壓縮儲存。