2015-04-24 101 views
3

我有一個類可以說aClass由默認構造函數自動創建的數組元素?

class aClass 
{ 
    public: 
    int data; 
    aClass(): data(-1) { //default constructor 
    } 
    aClass(int x): data(x) { //int constructor 
}; 

如果我創建像

aClass* arr=new aClass[10]; 

問題1磁盤陣列: 我想沒有aClass對象被創建,因爲它僅僅是一個的聲明數組,但是在我測試的程序中看起來像arr[0]arr[9]都指向一個aClass對象,它的類由默認構造函數創建?因爲我已經測試了這個程序,結果是a[0].data=-1一直到a[9].data=-1

問題2:如果使用其默認構造函數創建對象,我該如何創建一個由int構造函數創建的對象的數組?很明顯,我不能寫代碼像

aClass* arr=new aClass(2015)[10]; 
+0

除了一些更高級的東西之外,所有東西都在C++中被初始化到某種程度。對於'new Type [size]',它是默認初始化。碰巧的是對基本類型,如'int'默認初始化被指定爲沒有初始化。 – chris

+0

_「我在想沒有創建aClass對象,因爲它只是一個」數組聲明「_呃,是的...一個對象數組。 –

回答

3

Quesntion 1:我想沒有ACLASS對象被創建,因爲它僅僅是一個數組

你在想錯的聲明。它是一個指針的聲明,它用new aClass[10]的返回值進行初始化,其中構造了一個由10個對象組成的數組。

但在一個我測試過的程序中,它看起來像arr [0]到arr [9]所有的點都指向由它的類中的默認構造函數創建的aClass對象?

是的,你的觀察是正確的。

問題2:如果使用其默認構造函數創建對象,我該如何創建一個由int構造函數創建的對象的數組?

由於C++ 11,你可以使用列表初始化:aClass *foo = new aClass[3]{1, 2, 3};克里斯在評論中指出。

您可能需要使用std :: vector。有std::vector::vector(size_type n, const value_type& val)構造副本和自C++ 11:std::vector::vector(initializer_list<value_type>)爲不同的值。

對於靜態/自動數組甚至在C++ 11集合初始化是可能的:

aClass foo[3] = { 1, 2, 3 }; 
+0

'arr [0]'到'arr [9]'all **引用**一個aClass對象...看起來更好 – Lingxi

+0

你可以用動態數組:aClass * foo = new aClass [3] {1,2,3};'很確定只有自C++ 11以來,'std :: vector'是一個更好的選擇 – chris

+0

@chris哦,很酷,我不知道這個,請記住,如果我把它添加到答案中, – user2079303

0

關於問題1. initialization規則非常剛性的。您的數組new[]表達式將創建一個值數組。這些值必須初始化,默認情況下它們使用default initialization

問題2的答案是你不能用動態數組來做到這一點。但是,std::vector確實提供了一個構造函數,它允許您提供一個將被複制到每個包含元素的對象。請參閱explicit vector(size_type count, const T& value = T(), const Allocator& alloc = Allocator())

如果要集合中的每個元素是不同的,則必須使用一個循環和分配單獨除非陣列的大小是靜態在這種情況下可以使用初始化表達式確定的元素。如果你想避免動態容器默認的初始建設,那麼你不應該對象的值存儲。你應該使用一個指針的容器,或者更好的是一個智能指針的容器。然後你可以使用每個對象的直接初始化。

1

而不是aClass* arr=new aClass(2015)[10];
如果你的編譯器支持它,你可以做aClass *arr = new aClass[10]{2015, 2015/*etc*/};

在C++ 11,這兩個意思是一樣的。

aClass *arr = new aClass[10]; 
aClass *arr = new aClass[10]{}; 

更好的選擇是使用std::vector並避免使用原始指針,而使用智能指針前。 std::unique_ptr。這種替代的

例子是:

int main() 
{ 
    vector<unique_ptr<aClass>> vec; 
    for (int i{0}; i != 10; ++i) 
     vec.emplace_back(new aClass(2015)); 

    for (auto const& i : vec) // print data 
     cout << i->data << endl; 

    return 0; 
} 
0

您需要創建的指針數組,如果你想在不創建對象,創建一個數組。例如,aClass** arr = new aClass*[10];創建指針的陣列。當你想創建實際的對象時,你需要做這樣的事情:arr[0] = new aClass(2015);