首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 經典面試題精選與深度解析(上)

     編輯:關於C++

整理 40 道經典 C/C++ 面試題,涵蓋語言機制、記憶體管理、位運算、資料庫、演算法邏輯等核心領域。每題附帶標準答案與詳細解析,助力技術面試準備與基礎鞏固。

語言核心機制

1. virtual 繼承與多態

問題:父類虛函數,子類覆寫不加 virtual 是否仍多態?

答案:是。virtual 屬性隱式繼承。private 成員也會繼承,只是派生類無存取權限。子類空間包含父類所有非 static 成員。同一函數實體僅有一份(inline 除外)。

2. 字串反轉實作

方案一:雙指針交換

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

3. Windows 記憶體管理概述

虛擬記憶體、頁式/段式/段頁式管理、頁表轉換、工作集、頁面置換演算法(LRU、Clock 等)。現代 Windows 採用段頁式管理,4KB 頁框,支援大頁面、記憶體壓縮、SuperFetch 等優化。

4. 宏展開陷阱

#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))。

5. const 指針語義辨析

宣告含義
const char *p指向常字元的指針,p 可變,*p 不可變
char const *p同上(const 在 * 左側修飾指向物)
char * const p常指針,p 不可變,*p 可變
const char * const p雙重常量,p 與 *p 皆不可變

6. 防禦性 if 判斷寫法

if (10 == n) 優於 if (n == 10):誤寫成 = 時編譯報錯,避免靜默賦值 Bug。

7-11. 記憶體操作常見錯誤

  • malloc 未轉型:C++ 需 (char*)malloc(...)
  • realloc 後未檢查原指針釋放:若 realloc 失敗返回 NULL,原記憶體未釋放 → 洩漏
  • sscanf 參數缺址運算符:sscanf(p, "%s%d", str, &n)
  • strcpy 緩衝區溢位:目標陣列大小須 ≥ 來源長度 + 1(含結束符)
  • strcpy 不檢查結束符:建議用 strncpy 或 memcpy 配合長度檢查

12. static 區域變量與可重入性

static int SRM_no 未顯式初始化,系統歸零。但值跨呼叫保留 → 不可重入,多執行緒/遞歸/訊號處理中極危險。

13. sizeof 運算元差異

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位系統)

14. 位欄位運算

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

15. 判斷系統位數

法一:int i = 65536; cout << i; 16位輸出 0(溢位),32位輸出 65536

法二:int a = ~0; if (a > 65536) cout << "32 bit"; else cout << "16 bit";

16. C 與 C++ 差異

  • 範式:C 面向過程,C++ 面向物件(支援類、繼承、多態、模板)
  • 適用:C 適合嵌入式、核心、高效能場景;C++ 適合複雜應用層
  • Linux 核心主因:效率極致要求、避免隱式代碼膨脹、C 編譯器更成熟穩定

17. 無第三變量交換

// 加減法(可能溢位)
a = a + b; b = a - b; a = a - b;
// 異或法(無溢位風險)
a ^= b; b ^= a; a ^= b;
// 巧妙單行
a = a + b - (b = a);

18. 位欄位截斷

char t:4; t = 'b'; // 'b'=0x62=01100010 → 截取低4位 0010=2 → 輸出 ASCII 2 (控制字元)

19. 運算子優先級

k *= i + j; 等價 k = k * (i + j),k=3, i=10, j=10 → 3*20=60。

20. 進程間通訊 (IPC) 方式

共享記憶體、管道(匿名/命名)、Socket、訊息佇列、DDE、信號、Semaphore。

進階題目預告

本文收錄第 1-20 題,後續將發布結構體記憶體對齊、sizeof 深度解析、SQL 查詢優化、類設計缺陷分析、大端/小端判斷、同步原語對比、智慧指針實作等進階專題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved