[英]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段,未完全引用):
new T[n]
這樣的新表達式時,這些值將默認初始化 。 new T[n]()
這樣的新表達式時,將直接初始化值。 對於數組,僅直接初始化的值初始化適用。 默認初始化基本上意味着對於具有默認構造函數的類,將調用默認構造函數,對於沒有用戶定義的默認構造函數的類(即,當根本沒有默認構造函數或使用= default
將默認構造函數默認= default
),成員是默認初始化。 內置類型的默認初始化不執行任何操作,即,默認初始化的內置類型未初始化,並且在初始化之前讀取相應的對象會導致未定義的行為。
值初始化意味着對於具有默認構造函數的類,將調用默認構造函數,對於不具有默認構造函數的類,將對其成員進行值初始化。 內置類型的值初始化會導致零初始化 ,而零初始化會對內置類型進行適當的初始化(對於整數和浮點類型為零,對於指針為null,對於bool
為false
,等等)。
因此,在您的三個示例中,您將獲得:
new People[count]
您可以通過調用默認的People
構造函數來初始化類型為People
count
對象。 new int[count]
您將獲得默認初始化的count
,即未初始化的int
s和表達式*(arr + 2)
(相當於arr[2]
)產生不確定的行為。 new int[count]()
你count
零個初始化int
S,即它們都是零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.