用&实例化的对象之间究竟有什么区别?没有括号?

时间:2011-08-16 20:08:57

标签: c++ constructor

  

可能重复:
  Do the parentheses after the type name make a difference with new?

假设Obj不是特殊类

Obj* obj = new Object;

VS

Obj* obj = new Object();

究竟是什么区别?

2 个答案:

答案 0 :(得分:2)

对于对象,没有区别 - 每个都会​​调用默认构造函数。

对于“普通旧数据”(POD)类型,存在很大差异。第一种形式是未初始化的数据(无论内存中剩余的是什么),另一种形式将为其提供已知的默认值。

int* p1 = new int;   // *p1 == ???
int* p2 = new int(); // *p2 == 0

答案 1 :(得分:2)

对于您的确切示例,如果类型为非POD,则没有区别。 3个案例有一个区别:

1。当它是原始类型时:

int* pi = new int();

在这种情况下,()表示必须将其初始化为默认值。对于基于int的类型和浮点类型,它是0.所以这里,* pi == 0。

2. 当它是一个基本类型的数组时:

int* ai = new int[42]();

它的含义相同:所有对象都将初始化为默认值,此处为0.因此,在此示例中,* 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中的新初始化语法使得为任何类型的初始化使用相同的语法变得更加容易。)