C++ 是一門功能強大的編程語言,廣泛應用于系統編程、游戲開發和高性能計算等領域。本文將通過一系列經典問題,深入探討 C++ 的核心知識點,包括內存管理、多態(結合函數重載與覆蓋)、多線程、TCP/IP 模型、軟鏈接與硬鏈接的區別,以及常見算法實現。每個知識點都配有詳細的代碼示例和解釋,幫助你更好地理解和掌握。
1. 內存管理:內存泄露與檢測
什么是內存泄露?
內存泄露是指程序在動態分配內存后,未能正確釋放已不再使用的內存,導致內存占用持續增加,最終可能耗盡系統資源,引發程序崩潰或系統性能下降。
如何檢測內存泄露?
- 手動檢查:確保每個
new
或malloc
都有對應的delete
或free
。 - 使用工具:
- Valgrind:適用于 Linux 的內存調試工具。
- AddressSanitizer:集成于 GCC 和 Clang 中的內存檢測工具。
- Visual Studio 診斷工具:Windows 平臺上的內存泄露檢測工具。
代碼示例
#include <iostream>
#include <memory>void memoryLeakExample() {int* ptr = new int(10); // 分配內存// 忘記 delete ptr;
}int main() {memoryLeakExample();return 0;
}
2. 多態:函數重載、函數覆蓋與多態
什么是多態?
多態是面向對象編程的三大特性之一,指同一操作作用于不同對象時,可以有不同的解釋和執行結果。
函數重載(Overloading)
- 定義:在同一作用域內,函數名相同但參數列表不同。
- 特點:
- 編譯時確定調用哪個函數。
- 與返回值類型無關。
函數覆蓋(Overriding)
- 定義:派生類重新定義基類中的虛函數。
- 特點:
- 運行時確定調用哪個函數。
- 必須使用
virtual
關鍵字聲明基類函數。
多態的實現
- 靜態多態:通過函數重載和模板實現。
- 動態多態:通過虛函數和繼承實現。
代碼示例
#include <iostream>// 函數重載
void print(int a) { std::cout << "整數: " << a << std::endl; }
void print(double a) { std::cout << "浮點數: " << a << std::endl; }// 多態
class Animal {
public:virtual void speak() { std::cout << "動物叫" << std::endl; }
};class Dog : public Animal {
public:void speak() override { std::cout << "汪汪汪" << std::endl; }
};int main() {// 函數重載print(5); // 調用 print(int)print(3.14); // 調用 print(double)// 多態Animal* animal = new Dog();animal->speak(); // 輸出 "汪汪汪"delete animal;return 0;
}
3. 多線程:基礎與實現
什么是多線程?
多線程是指程序同時執行多個任務的能力,C++11 起通過 <thread>
標準庫支持多線程。
代碼示例
#include <iostream>
#include <thread>void task1() { std::cout << "線程1執行" << std::endl; }
void task2(int x) { std::cout << "線程2執行,參數: " << x << std::endl; }int main() {std::thread t1(task1);std::thread t2(task2, 42);t1.join();t2.join();return 0;
}
4. TCP/IP 四層模型
什么是 TCP/IP 四層模型?
TCP/IP 模型是互聯網通信的核心框架,分為四層:
- 網絡接口層:負責物理網絡傳輸。
- 網絡層:實現數據包的邏輯尋址和路由選擇。
- 傳輸層:提供端到端的數據傳輸服務。
- 應用層:為應用程序提供網絡服務接口。
核心協議
- IP:網絡層協議,負責數據包的傳輸。
- TCP/UDP:傳輸層協議,分別提供可靠和不可靠的傳輸服務。
- HTTP/HTTPS:應用層協議,用于網頁數據傳輸。
5. 軟鏈接與硬鏈接的區別
什么是軟鏈接和硬鏈接?
- 硬鏈接:直接指向文件的 inode,與原始文件共享數據。
- 軟鏈接:是一個獨立的文件,存儲目標文件的路徑。
代碼示例
#include <iostream>
#include <filesystem>namespace fs = std::filesystem;int main() {fs::create_hard_link("source.txt", "hardlink.txt");fs::create_symlink("source.txt", "symlink.txt");return 0;
}
6. 算法實現:找出只出現一次的數字
問題描述
在一個整型數組里,除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
代碼示例
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <iostream>using namespace std;class Solution {
public:vector<int> FindNumsAppearOnce(vector<int>& nums) {unordered_map<int, int> countMap;for (int num : nums) {countMap[num]++;}vector<int> result;for (int num : nums) {if (countMap[num] == 1) {result.push_back(num);}}sort(result.begin(), result.end());return result;}
};int main() {Solution solution;vector<int> nums = {1, 4, 1, 6};vector<int> result = solution.FindNumsAppearOnce(nums);cout << "[" << result[0] << "," << result[1] << "]" << endl; // 輸出 [4,6]return 0;
}
總結
本文通過一系列經典問題,深入探討了 C++ 的核心知識點,包括內存管理、多態(結合函數重載與覆蓋)、多線程、TCP/IP 模型、軟鏈接與硬鏈接的區別,以及常見算法實現。每個知識點都配有詳細的代碼示例和解釋,幫助你更好地理解和掌握。希望這些內容能為你的編程學習和項目開發提供幫助!
參考資料
- C++ 官方文檔
- 《Effective C++》
- 《深入理解計算機系統》
如果你有任何問題或建議,歡迎在評論區留言!
1. 內存管理:內存泄露與檢測
什么是內存泄露?
內存泄露是指程序在動態分配內存后,未能正確釋放已不再使用的內存,導致內存占用持續增加,最終可能耗盡系統資源,引發程序崩潰或系統性能下降。
如何檢測內存泄露?
- 手動檢查:確保每個
new
或malloc
都有對應的delete
或free
。 - 使用工具:
- Valgrind:適用于 Linux 的內存調試工具。
- AddressSanitizer:集成于 GCC 和 Clang 中的內存檢測工具。
- Visual Studio 診斷工具:Windows 平臺上的內存泄露檢測工具。
代碼示例
#include <iostream>
#include <memory>void memoryLeakExample() {int* ptr = new int(10); // 分配內存// 忘記 delete ptr;
}int main() {memoryLeakExample();return 0;
}
2. 多態:函數重載、函數覆蓋與多態
什么是多態?
多態是面向對象編程的三大特性之一,指同一操作作用于不同對象時,可以有不同的解釋和執行結果。
函數重載(Overloading)
- 定義:在同一作用域內,函數名相同但參數列表不同。
- 特點:
- 編譯時確定調用哪個函數。
- 與返回值類型無關。
函數覆蓋(Overriding)
- 定義:派生類重新定義基類中的虛函數。
- 特點:
- 運行時確定調用哪個函數。
- 必須使用
virtual
關鍵字聲明基類函數。
多態的實現
- 靜態多態:通過函數重載和模板實現。
- 動態多態:通過虛函數和繼承實現。
代碼示例
#include <iostream>// 函數重載
void print(int a) { std::cout << "整數: " << a << std::endl; }
void print(double a) { std::cout << "浮點數: " << a << std::endl; }// 多態
class Animal {
public:virtual void speak() { std::cout << "動物叫" << std::endl; }
};class Dog : public Animal {
public:void speak() override { std::cout << "汪汪汪" << std::endl; }
};int main() {// 函數重載print(5); // 調用 print(int)print(3.14); // 調用 print(double)// 多態Animal* animal = new Dog();animal->speak(); // 輸出 "汪汪汪"delete animal;return 0;
}
3. 多線程:基礎與實現
什么是多線程?
多線程是指程序同時執行多個任務的能力,C++11 起通過 <thread>
標準庫支持多線程。
代碼示例
#include <iostream>
#include <thread>void task1() { std::cout << "線程1執行" << std::endl; }
void task2(int x) { std::cout << "線程2執行,參數: " << x << std::endl; }int main() {std::thread t1(task1);std::thread t2(task2, 42);t1.join();t2.join();return 0;
}
4. TCP/IP 四層模型
什么是 TCP/IP 四層模型?
TCP/IP 模型是互聯網通信的核心框架,分為四層:
- 網絡接口層:負責物理網絡傳輸。
- 網絡層:實現數據包的邏輯尋址和路由選擇。
- 傳輸層:提供端到端的數據傳輸服務。
- 應用層:為應用程序提供網絡服務接口。
核心協議
- IP:網絡層協議,負責數據包的傳輸。
- TCP/UDP:傳輸層協議,分別提供可靠和不可靠的傳輸服務。
- HTTP/HTTPS:應用層協議,用于網頁數據傳輸。
5. 軟鏈接與硬鏈接的區別
什么是軟鏈接和硬鏈接?
- 硬鏈接:直接指向文件的 inode,與原始文件共享數據。
- 軟鏈接:是一個獨立的文件,存儲目標文件的路徑。
代碼示例
#include <iostream>
#include <filesystem>namespace fs = std::filesystem;int main() {fs::create_hard_link("source.txt", "hardlink.txt");fs::create_symlink("source.txt", "symlink.txt");return 0;
}
6. 算法實現:找出只出現一次的數字
問題描述
在一個整型數組里,除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
代碼示例
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <iostream>using namespace std;class Solution {
public:vector<int> FindNumsAppearOnce(vector<int>& nums) {unordered_map<int, int> countMap;for (int num : nums) {countMap[num]++;}vector<int> result;for (int num : nums) {if (countMap[num] == 1) {result.push_back(num);}}sort(result.begin(), result.end());return result;}
};int main() {Solution solution;vector<int> nums = {1, 4, 1, 6};vector<int> result = solution.FindNumsAppearOnce(nums);cout << "[" << result[0] << "," << result[1] << "]" << endl; // 輸出 [4,6]return 0;
}
總結
本文通過一系列經典問題,深入探討了 C++ 的核心知識點,包括內存管理、多態(結合函數重載與覆蓋)、多線程、TCP/IP 模型、軟鏈接與硬鏈接的區別,以及常見算法實現。每個知識點都配有詳細的代碼示例和解釋,幫助你更好地理解和掌握。希望這些內容能為你的編程學習和項目開發提供幫助!
參考資料
- C++ 官方文檔
- 《Effective C++》
- 《深入理解計算機系統》
如果你有任何問題或建議,歡迎在評論區留言!