可能重複:
Do the parentheses after the type name make a difference with new?使用&不帶圓括號實例化的對象究竟有什麼區別?
假設obj不是一類特殊的
Obj* obj = new Object;
VS
Obj* obj = new Object();
究竟有什麼區別?
可能重複:
Do the parentheses after the type name make a difference with new?使用&不帶圓括號實例化的對象究竟有什麼區別?
假設obj不是一類特殊的
Obj* obj = new Object;
VS
Obj* obj = new Object();
究竟有什麼區別?
對於對象,沒有區別 - 每個對象都會調用默認構造函數。
對於「普通舊數據」(POD)類型,存在很大差異。第一種形式將是未初始化的數據(無論內存中剩餘的),另一種將給它一個已知的默認值。
int* p1 = new int; // *p1 == ???
int* p2 = new int(); // *p2 == 0
對於您的確切示例,如果該類型爲非POD,則沒有區別。有3情況下,一個區別:
1.當它是一個基本類型:
int* pi = new int();
在這種情況下,()表示它必須被初始化爲默認值。對於基於INT-類型和浮點類型,它是0。因此,這裏,* PI == 0
2.當它的原語類型的數組:
int* ai = new int[42]();
這意味着相同的:所有在這個例子中,從* ai到*(ai + 41)的所有元素都將等於0.
3.如果類型是POD,則該對象將被初始化爲默認值, ,那麼默認的初始化是在所有成員上完成的。
順便問一下,你也可以初始化基本類型的默認值初始化列表:
class myType
{
public:
myType() : m_k(), m_t(){} // m_k == 0 && m_t ==0
private:
int m_k;
double m_t;
};
在您的例子)的含義(是相同的,但對非基本類型,默認的構造函數被隱式調用,使得()不是必需的。爲了保持一致性,它仍然被使用,因爲這種方式對每個對象創建都使用相同的語法。 (也就是說,C++ 0x中的新的初始化語法使得對於任何類型的初始化都具有相同的語法更容易)。
對於確切的例子,是否是未知的它有所作爲。它取決於'對象'的定義(即什麼*不是特殊的類*的意思),如果它是不同的POD,如果它有一個默認的構造函數,那麼它根本就沒有關係。 –
啊,是的,我忘記了POD病例XD – Klaim
http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new/620402 – buck