1. 獲取變量類型:typeid
C++ RTTI(運行時類型識別)提供 typeid(expr).name() 返回類型名稱字符串(實現定義,通常為修飾名)。需包含 <typeinfo>。
#include <iostream>
#include <typeinfo>
int main() {
int a = 42;
double b = 3.14;
std::cout << typeid(a).name() << '\n'; // 可能輸出 "i"
std::cout << typeid(b).name() << '\n'; // 可能輸出 "d"
// 針對多態類型,typeid(*ptr) 可獲取動態類型
}
注意:typeid 作用於表達式而非類型(C++11 起也支援 typeid(type))。對於指針,typeid(ptr) 給靜態類型,typeid(*ptr) 給動態類型(要求類有虛函數)。
2. bool 與 C/C++ 差異
- C++ 內建
bool,值為 true/false,大小 ≥ 1 字節
- C99 通過
<stdbool.h> 定義 bool 為 _Bool 宏,C89 無原生布爾類型,常用 int 模擬
- C++ 隱式轉換:非零 →
true,零 → false;true→1,false→0
3. new / delete vs malloc/free
| 特性 | new/delete | malloc/free |
| 類型安全 | 是(返回正確類型指針) | 否(返回 void*) |
| 構造/析構 | 自動調用 | 需手動調用 |
| 失敗處理 | 拋出 bad_alloc | 返回 NULL |
| 重載 | 可重載(全局/類內) | 不可重載 |
| 數組 | new T[n] / delete[] | 手動計算大小 |
定位 new:new (buffer) T(args) 在預分配緩衝區構造對象,不分配內存,需手動調用析構函數 ptr->~T()。
4. C++ 枚舉:enum vs enum class (C++11)
template
void print(T first, Args... rest) {
std::cout << first << ' ';
if constexpr (sizeof...(rest) > 0) // C++17 折疊表達式更簡潔
print(rest...);
}
// C++17 折疊表達式
template
void print2(Args... args) {
(std::cout << ... << args) << '\n';
}
6. auto 與函數模板
auto (C++11) 根據初始化表達式推導類型,規則同模板參數推導:
auto x = 42; → int
auto& r = x; → int&
auto* p = &x; → int*
auto&& u = expr; → 萬能引用(保留值類別)
函數模板 實現泛型演算法:
template
T max(T a, T b) { return a > b ? a : b; }
// C++14 返回類型推導
template
auto add(T a, U b) { return a + b; }
// C++20 概念約束
template
T square(T x) { return x * x; }
7. 寬字符與 Unicode 支援
wchar_t:寬字符類型(實現定義大小,Windows 2 字節 UTF-16,Linux 4 字節 UTF-32)
char16_t, char32_t (C++11):固定大小 Unicode 字符類型
- 寬字符串字面量:
L"中文", u"中文" (UTF-16), U"中文" (UTF-32), u8"中文" (UTF-8)
- 對應流:
wcout, wcin, wstring
- 轉換工具:
std::wstring_convert (C++11, C++17 棄用), std::codecvt, 或第三方庫(ICU, Boost.Locale)
最佳實踐:內部統一使用 UTF-8 (std::string + u8""),僅在與系統 API 交互時轉換為寬字符。
- 上一篇文章: C++ 實現不可繼承類:私有構造 + 虛繼承友元模式
- 下一篇文章: POJ 1692 Crossed Matchings:DP 求最大交叉匹配數
Copyright ©
程式碼之家 All Rights Reserved