2010-06-10 46 views
0
class A 
{ 
private: 
int m_nValue; 
public: 
A() 
{ 
m_nValue = 0; 
} 
A(int nValue) 
{ 
m_nValue = nValue); 
~A() 
{} 
} 

現在主如果我叫動態內存分配使用默認值

A a(2);// 2 will be assigned for m_nValue of object A. 

現在我們該怎麼做,如果我要定義對象的數組。 此外,我們如何做到這一點,如果我使用new運算符 像

A *pA; 
pA = new A[5];// while creating the object i want the parameterised constructor to be 

//called 

我希望這個問題是清楚的動態創建的對象。請讓我知道是否需要更多解釋

+0

更多「好奇心」?或者更多沒有準備閱讀C++教科書? – 2010-06-10 17:19:30

+0

只是「好奇心」。 – ckv 2010-06-10 17:21:11

+2

那麼你在哪些C++教科書中使用了這個問題沒有涉及? – 2010-06-10 17:23:30

回答

5

你不能這樣做。

如果你想動態分配一個數組,它必須是一個默認構造的對象。這意味着,它需要有一個沒有參數的構造函數,它將被使用。

+0

不正確。對於使用new-expressions分配的數組,這是真的,但對於一般的數組來說不是這樣。非默認構造對象的數組可以很容易用集合初始化器聲明。 – AnT 2010-06-10 18:39:47

1

你通常不能這樣做,因爲數組對象是默認構造的,但是你可以創建一個子類,它的默認構造函數傳遞你想要的基類的參數。

template<int I> 
class B : public A 
{ 
public: 
    B() : A(I) { } 
}; 
... 

A *pA; 
pA = new B<42>[5]; 

但是,以這種方式濫用繼承在某些圈子中是不被接受的。

2

如果我想定義對象

這是C的陣列++,你不想陣列;-)

std::vector<A> v(5, A(2)); 
+0

+1表示向量 – Default 2010-06-11 06:35:56

1

如果要定義一個數組,則可以使用聚合初始值設定程序

A a[5] = { 1, 2, 3, 4, 5 }; 

注意,雖然聚合初始化遵循copy-initializa重刑語義,所以對於每一個元素也將等同於

A a1 = 1; 

不是你原來的

A a1(1); 

至於新的表達......你可以在陣列中提供的唯一初始化新 - 表達式是空的()初始值設定項,它會觸發值初始化。目前沒有其他的初始化器支持該語言。