首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 中 new 運算符:new T() 與 new T 的區別詳解

     編輯:程式設計疑難解答

問題描述

代碼片段:

class app {
public:
    bool creat() {
        app *p = new app(); // 這裡的括號有什麼作用?
        return true;
    }
};

查閱資料說明是指明調用默認構造函數,但默認構造函數不返回指針,感到困惑。

核心區別:值初始化 vs 默認初始化

1. new app() —— 值初始化

  • 若 app 為類類型且有用戶聲明的構造函數,調用默認構造函數。
  • 若 app 為聚合類型或無用戶聲明構造函數,則進行零初始化:內建類型成員(int、指標、float 等)被初始化為 0、nullptr、0.0。

2. 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() 確保成員被零初始化,避免未定義行為。
  • 在類定義中為內建類型成員提供默認成員初始化器(C++11):int x = 0;。
  • 優先使用智能指標(std::unique_ptr、std::make_unique)管理動態記憶體。

總結

new app() 的括號觸發值初始化,保證內建類型成員歸零;new app 僅調用構造函數,不保證成員初始化。理解此區別對編寫健壯 C++ 代碼至關重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved