在 C++ 中,內置類型(如?int
、float
、double
、char
、指針等)的初始化方式與類類型(如?std::string
、自定義類)不同。由于內置類型沒有構造函數,它們的初始化行為由編譯器直接處理。以下是詳細解析:
類中的內置類型成員初始化
在類中,內置類型成員的初始化方式取決于:
-
是否有類內聲明默認值?
-
是否在構造函數初始化列表中顯式初始化?
情況 1:無默認值 + 無顯式初始化 → 隨機值
cpp
class Foo {int x; // 未初始化 public:Foo() {} // x 的值是隨機的 };
-
行為:
x
?沒有賦值行為,值是內存殘留數據(UB)。
情況 2:有類內默認值 → 使用默認值
cpp
class Bar {int x = 42; // 類內默認值 public:Bar() {} // Bar():x(42) {} };
-
行為:編譯器在構造函數中插入?
x (42)
?的代碼,生成的目標文件中構造函數會有x賦值42的硬編碼指令。
情況 3:顯式初始化列表 → 覆蓋默認值
cpp
class Baz {int x = 42; // 類內默認值 public:Baz() : x(100) {} // x = 100(覆蓋默認值) };
-
行為:編譯器在構造函數中插入?
x (100)
?的代碼,生成的目標文件中構造函數會有x賦值100的硬編碼指令。
?