目錄
一、核心語法
1.指針VS引用
2. 類與對象(必寫代碼)
3. 繼承與多態(必寫代碼)
4. 模板(必寫代碼)
5.智能指針
?6. 異常處理(必寫結構)
二、簡答題速記
三、考試應急策略
一、核心語法
1.指針VS引用
區別 | 指針 | 引用 |
---|---|---|
定義 | 存儲地址的變量,可改指向 | 變量的別名,綁定后不可改 |
初始化 | 可空(nullptr )、延遲初始化 | 必須初始化,不能引用空值 |
訪問 | 需解引用(*p /-> ) | 直接用變量名,語法同原變量 |
空值 | 允許nullptr | 無空引用,綁定后必有效 |
自增/減 | 支持(移動地址) | 不支持(別名不變) |
代碼示例:
cpp運行
int a = 10;
int* p = &a; // 指針存地址
int& ref = a; // 引用是別名 p = nullptr; // 指針可改指向
// ref = nullptr; // 錯誤!引用不能改綁定
2. 類與對象(必寫代碼)
封裝 + 構造 / 析構 + 拷貝控制:
cpp運行
class Student {
private:string name;int age;
public:// 構造函數(重載 + 初始化列表)Student(string n = "無名", int a = 0) : name(n), age(a) {} // 拷貝構造(深拷貝場景需手動寫,如含指針成員)Student(const Student& other) : name(other.name), age(other.age) {} // 析構函數(含動態內存時必寫,如指針)~Student() { /* 釋放資源 */ } // 成員函數void print() const { cout << "姓名:" << name << ",年齡:" << age << endl; }
};// 調用示例
Student zs("張三", 18);
zs.print();
Student ls = zs; // 調用拷貝構造
3. 繼承與多態(必寫代碼)
虛函數 + 純虛函數 + 多態調用:
cpp運行
class Animal {
public:// 純虛函數(抽象類,強制派生類實現)virtual void speak() = 0; // 虛析構(避免派生類對象析構不完整)virtual ~Animal() {}
};class Dog : public Animal {
public:void speak() override { // override 顯式重寫cout << "汪汪!" << endl; }
};// 多態調用(基類指針/引用指向派生類對象)
Animal* animal = new Dog();
animal->speak(); // 輸出“汪汪!”(運行時綁定)
delete animal;
4. 模板(必寫代碼)
函數模板 + 類模板:
// 函數模板(泛型交換)
template <typename T>
void swap(T& a, T& b) {T temp = a;a = b;b = temp;
}// 類模板(簡單棧)
template <typename T>
class Stack {
private:vector<T> data;
public:void push(const T& val) { data.push_back(val); }T pop() { T top = data.back();data.pop_back();return top; }
};// 調用示例
Stack<int> s;
s.push(10);
int x = s.pop();
5.智能指針
類型 | 特點 | 場景 |
---|---|---|
unique_ptr | 獨占所有權,不可拷貝 | 簡單對象管理,避免資源泄漏 |
shared_ptr | 共享所有權(引用計數) | 多對象共享資源,需注意循環引用 |
weak_ptr | 弱引用(不影響計數) | 解決shared_ptr 循環引用 |
代碼示例:
// unique_ptr(獨占)
unique_ptr<Student> p1 = make_unique<Student>("李四", 20);// shared_ptr(共享)
shared_ptr<Student> p2 = make_shared<Student>("王五", 22);
shared_ptr<Student> p3 = p2; // 引用計數+1// weak_ptr(弱引用)
weak_ptr<Student> p4 = p2; // 不影響計數
?6. 異常處理(必寫結構)
try {// 可能拋異常的代碼if (error) throw runtime_error("出錯了!");
} catch (const runtime_error& e) {// 捕獲特定異常cout << "錯誤:" << e.what() << endl;
} catch (...) {// 兜底捕獲cout << "未知異常" << endl;
}
二、簡答題速記
1. 指針和引用的區別
定義:指針存地址,可改指向;引用是別名,綁定后不可改。
初始化:指針可空、延遲初始化;引用必須初始化,不能引用空值。
訪問:指針需解引用(*p);引用直接用變量名。
空值:指針允許nullptr;引用無空引用。
2. 虛函數的實現原理
虛函數表(vtable):每個含虛函數的類編譯時生成虛表,存儲虛函數地址。
虛表指針(vptr):對象構造時,vptr 指向類的虛表。
調用機制:通過 vptr 查表,運行時動態綁定函數(多態的核心)。
3. 拷貝構造函數的調用場景
用對象初始化新對象:Student s2 = s1; 或 Student s2(s1);。
函數按值傳遞對象:void func(Student obj),調用時拷貝實參。
函數返回對象(值返回):Student func() { Student s; return s; },返回時拷貝臨時對象。
4. 內存泄漏及解決方法
內存泄漏:動態分配的內存(new/malloc)未釋放,長期占用內存。
解決方法:
用智能指針(unique_ptr/shared_ptr)自動管理。
嚴格配對 new/delete、malloc/free。
工具檢測(如 Valgrind、AddressSanitizer)。
5. 重載(overload)、覆蓋(override)、重寫(overwrite)區別
重載(overload):同一作用域,函數名相同,參數(類型 / 個數 / 順序)不同,編譯期決議。
覆蓋(override):派生類重寫基類虛函數,函數簽名(名、參數、返回)完全一致,運行期多態。
重寫(overwrite):非標準說法,常指覆蓋(override)或隱藏基類函數(如派生類定義同名非虛函數)。
三、考試應急策略
代碼題:優先寫框架(類定義、函數模板結構),再補細節(構造函數、虛函數、智能指針)。
簡答題:抓關鍵詞(如 “虛函數表”“引用計數”“拷貝場景”),按點作答。
易錯點:
- 多態必須用虛函數 + 基類指針 / 引用。
- 智能指針注意 unique_ptr 不可拷貝,shared_ptr 需避免循環引用。
- 模板代碼記得寫 template <typename T>。