簡體   English   中英

在C ++中聲明靜態/動態數組是否自動在每個元素上調用默認構造函數?

[英]Does declaring a static/dynamic array in C++ call default constructor on each element automatically?

問題在於主題。 我也很好奇,如果原始類型與對象的行為不同?

這是一個很難回答的棘手問題。 它被問過(並回答過)很多次,但我找不到確切的重復項。

首先, 聲明數組不會分配任何存儲空間,也不會導致執行任何構造函數。 也許您的意思是定義 分配數組。

靜態存儲區(任何塊之外)中定義的數組,無論其類型如何,其存儲區均填充零。

自動存儲(在塊內)中定義的數組會分配未初始化的內存。

通過分配動態存儲(使用new [])創建的數組將分配未初始化的內存。

無論采用哪種存儲分配方法,都將對數組進行default-initialised n3797 S8.5 / 7中定義了什么意思:

要默認初始化類型T的對象意味着:
—如果T是(可能是cv限定的)類類型(第9條),則調用T的默認構造函數(12.1)(如果T沒有默認構造函數或重載分辨率(13.3),則會導致初始化不正確)從初始化上下文中刪除或無法訪問的歧義或函數中的歧義;
—如果T是數組類型,則每個元素都將默認初始化;
—否則,不執行初始化。

換句話說,類類型的數組在每個元素上都有其默認構造函數,而其他元素則保持不變。

另請參閱/ 12:

如果未為對象指定初始化程序,則該對象為默認初始化;否則,默認為初始化。 如果未執行初始化,則具有自動或動態存儲持續時間的對象的值不確定。

如果您將初始化添加到數組定義中,那么所有這些都將消失在窗口之外,但是我們將剩下另一個問題。

讓我們舉個例子。

struct Object
{
    Object(){
        std::cout << "new object is created";
    }
}
Object object1; // contructor is called here
Object object2; // and here

std::list<Object> my_list = {object1,object2}; //step 2

在第2步中,您不會創建Object類型的新對象,而只是將它們插入my_list中。 注意:插入數組會導致類似的行為。

關於第二個問題,原始類型是POD (即普通舊數據)類型,根據定義,它們不能具有用戶定義的構造函數。

是的,數組的所有元素都默認初始化(調用對象的默認構造函數,或者對於基元不確定)(除非也進行零初始化,在這種情況下,基元設置為零)。

但是,某些類未指定默認構造函數。 在這些情況下,如果不初始化數組,就無法擁有它們的數組,因為該數組將無法默認初始化對象。 您將不得不使用其他集合,例如vector

暫無
暫無

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

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