直接顯式調用構造函數 A() 但不創建對象實例,能否完成初始化?
構造函數的本質是「在已分配的內存上初始化對象」,而非「創建對象」。
operator new(sizeof(A)) 分配原始內存塊,返回 void* 指針。A* this,傳遞給構造函數,在該內存上初始化成員變量、調用基類/成員構造函數。this,賦值給對象變量。A() 創建一個臨時對象(右值),構造函數在臨時對象內存上運行,隨即析構銷毀。this 指向目標對象)。// 1. 棧上創建(自動生命周期)
A a; // 默認構造
A a(1, 2); // 帶參構造
// 2. 堆上創建(手動管理)
A* p = new A(); // 默認構造
A* p = new A(1, 2); // 帶參構造
delete p; // 必須手動釋放
// 3. 智能指針(現代 C++ 推薦)
std::unique_ptr p = std::make_unique(1, 2);
std::shared_ptr p = std::make_shared(1, 2);
// 4. 定位 new(在預分配內存上構造)
char buffer[sizeof(A)];
A* p = new (buffer) A(1, 2); // 不分配內存,直接在 buffer 上構造
p->~A(); // 手動調用析構函數
// 使用 std::optional (C++17)
std::optional opt;
opt.emplace(1, 2); // 真正構造時才調用構造函數
// 或指針 + 延遲 new
std::unique_ptr p;
if (condition) p = std::make_unique(1, 2);
構造函數必須在已分配的內存上運行,this 指向該內存。無對象實例調用構造函數,等同於創建並立即銷毀臨時對象,無任何持久化效果。對象創建 = 內存分配 + 構造函數調用,二者缺一不可。