整理 40 道經典 C/C++ 面試題,涵蓋語言機制、記憶體管理、位運算、資料庫、演算法邏輯等核心領域。每題附帶標準答案與詳細解析,助力技術面試準備與基礎鞏固。
問題:父類虛函數,子類覆寫不加 virtual 是否仍多態?
答案:是。virtual 屬性隱式繼承。private 成員也會繼承,只是派生類無存取權限。子類空間包含父類所有非 static 成員。同一函數實體僅有一份(inline 除外)。
方案一:雙指針交換
void main() {
char a[50] = {0};
cin.getline(a, 50);
for (int i = 0, j = strlen(a)-1; i < strlen(a)/2; i++, j--) {
char t = a[i]; a[i] = a[j]; a[j] = t;
}
cout << a << endl;
}
方案二:string::reverse_iterator 或 std::reverse
虛擬記憶體、頁式/段式/段頁式管理、頁表轉換、工作集、頁面置換演算法(LRU、Clock 等)。現代 Windows 採用段頁式管理,4KB 頁框,支援大頁面、記憶體壓縮、SuperFetch 等優化。
#define SQR(X) X*X
a /= SQR(k+m)/SQR(k+m); // k=2, m=1, a=10
// 展開:a /= (k+m)*(k+m)/(k+m)*(k+m)
// 運算:a /= 3*3/3*3 = 9/3*3 = 3*3 = 9
// a = 10/9 = 1 (整數除法)
教訓:宏參數必須加括號 #define SQR(X) ((X)*(X))。
| 宣告 | 含義 |
|---|---|
const char *p | 指向常字元的指針,p 可變,*p 不可變 |
char const *p | 同上(const 在 * 左側修飾指向物) |
char * const p | 常指針,p 不可變,*p 可變 |
const char * const p | 雙重常量,p 與 *p 皆不可變 |
if (10 == n) 優於 if (n == 10):誤寫成 = 時編譯報錯,避免靜默賦值 Bug。
(char*)malloc(...)sscanf(p, "%s%d", str, &n)strncpy 或 memcpy 配合長度檢查static int SRM_no 未顯式初始化,系統歸零。但值跨呼叫保留 → 不可重入,多執行緒/遞歸/訊號處理中極危險。
char str[] = "world"; // sizeof=6 (含\0)
char *p = str; // sizeof=4/8 (指針大小)
char i = 10; // sizeof=1
void *pp = malloc(10); // sizeof(p)=4/8 (指針大小)
輸出:6:4:1:4 (32位系統)
union V {
struct X { unsigned char s1:2, s2:3, s3:3; } x;
unsigned char c;
} v;
v.c = 100; // 01100100
// s3 佔高 3 位:011 = 3
printf("%d", v.x.s3); // 輸出 3
法一:int i = 65536; cout << i; 16位輸出 0(溢位),32位輸出 65536
法二:int a = ~0; if (a > 65536) cout << "32 bit"; else cout << "16 bit";
// 加減法(可能溢位)
a = a + b; b = a - b; a = a - b;
// 異或法(無溢位風險)
a ^= b; b ^= a; a ^= b;
// 巧妙單行
a = a + b - (b = a);
char t:4; t = 'b'; // 'b'=0x62=01100010 → 截取低4位 0010=2 → 輸出 ASCII 2 (控制字元)
k *= i + j; 等價 k = k * (i + j),k=3, i=10, j=10 → 3*20=60。
共享記憶體、管道(匿名/命名)、Socket、訊息佇列、DDE、信號、Semaphore。
本文收錄第 1-20 題,後續將發布結構體記憶體對齊、sizeof 深度解析、SQL 查詢優化、類設計缺陷分析、大端/小端判斷、同步原語對比、智慧指針實作等進階專題。