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

C++ 核心特性深度解析:typeid、bool、new/delete、枚舉、內聯、可變參數模板、auto、寬字符

     編輯:C++ 入門

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: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 交互時轉換為寬字符。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性new/deletemalloc/free
類型安全是(返回正確類型指針)否(返回 void*)
構造/析構自動調用需手動調用
失敗處理拋出 bad_alloc返回 NULL
重載可重載(全局/類內)不可重載
數組new T[n] / delete[]手動計算大小