簡體   English   中英

新的運算符+ C ++中的默認構造函數

[英]new operator + default constructor in c++

這個問題已經在這里討論了[鏈接] new []是否在C ++中調用默認構造函數?

作為一個初學者和一個自學者,請欣賞積極的評論,請不要將其概括為廣義,狹義等。

當我們使用new []時,每個元素都由默認構造函數初始化,除非類型是內置類型。 內置類型默認情況下保持統一。

這里說對象是由默認構造函數初始化的,這是什么意思? 就像每個對象現在都將鍵初始化為零(通過默認構造函數)一樣,因為當我打印p [2] .key時這是真的嗎?

我如何檢查默認構造函數是否初始化了一個數組或不是一個int數組,它無法訪問main中的成員鍵?

同樣(i)打印垃圾值,但(ii)打印0;

class People
{
    public:
      int key;
    People()
    {
        key=0;
    }
};

int main()
{
   int count=5;
   People *p=new People[count];
   cout<< p[2].key;

   // int *arr=new int[count]; ...(i)
   //cout<<*(arr+2);

  //int *arr=new int[count](); ... (ii)
 //cout<<*(arr+2)<<endl;

 return 0;
}

初始化分配數組的規則比調用默認構造函數要復雜一些。 標准實際上是這樣說的(5.3.4 [expr.new]第7段,未完全引用):

  1. 當使用像new T[n]這樣的新表達式時,這些值將默認初始化
  2. 當使用像new T[n]()這樣的新表達式時,將直接初始化值。 對於數組,僅直接初始化的初始化適用。

默認初始化基本上意味着對於具有默認構造函數的類,將調用默認構造函數,對於沒有用戶定義的默認構造函數的類(即,當根本沒有默認構造函數或使用= default將默認構造函數默認= default ),成員是默認初始化。 內置類型的默認初始化不執行任何操作,即,默認初始化的內置類型未初始化,並且在初始化之前讀取相應的對象會導致未定義的行為。

值初始化意味着對於具有默認構造函數的類,將調用默認構造函數,對於不具有默認構造函數的類,將對其成員進行值初始化。 內置類型的值初始化會導致零初始化 ,而零初始化會對內置類型進行適當的初始化(對於整數和浮點類型為零,對於指針為null,對於boolfalse ,等等)。

因此,在您的三個示例中,您將獲得:

  1. 使用new People[count]您可以通過調用默認的People構造函數來初始化類型為People count對象。
  2. 使用new int[count]您將獲得默認初始化的count ,即未初始化的int s和表達式*(arr + 2) (相當於arr[2] )產生不確定的行為。
  3. 隨着new int[count]()count零個初始化int S,即它們都是零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM