代碼片段:
class app {
public:
bool creat() {
app *p = new app(); // 這裡的括號有什麼作用?
return true;
}
};
查閱資料說明是指明調用默認構造函數,但默認構造函數不返回指針,感到困惑。
new app() —— 值初始化app 為類類型且有用戶聲明的構造函數,調用默認構造函數。app 為聚合類型或無用戶聲明構造函數,則進行零初始化:內建類型成員(int、指標、float 等)被初始化為 0、nullptr、0.0。new app —— 默認初始化struct A { int x; }; // 聚合類型
struct B { int x; B(){} }; // 有用戶聲明默認構造函數
int main() {
A* a1 = new A(); // a1->x 為 0(值初始化)
A* a2 = new A; // a2->x 不確定(默認初始化)
B* b1 = new B(); // 調用 B::B(),x 不確定(構造函數未初始化)
B* b2 = new B; // 同上
}
new T() 確保成員被零初始化,避免未定義行為。int x = 0;。std::unique_ptr、std::make_unique)管理動態記憶體。new app() 的括號觸發值初始化,保證內建類型成員歸零;new app 僅調用構造函數,不保證成員初始化。理解此區別對編寫健壯 C++ 代碼至關重要。