C ++ - 哪一个应该使用“新车”或“新车()”?

时间:2010-12-30 16:21:58

标签: c++

  

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

大家好,

class Car
{
public:
    Car() : m_iPrice(0) {}
    Car(int iPrice) : m_iPrice(iPrice) {}

private:
    int m_iPrice;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Car  car1;    // Line 1
    Car  car2();  // Line 2, this statement declares a function instead.

    Car* pCar = new Car; // Line 3
    Car* pCar2 = new Car(); // Line 4

    return 0;
}

这是我的问题:

当我们定义Car的对象时,我们应该使用第1行而不是第2行。 当我们新建一个对象时,第3行和第4行都可以通过VC8.0的编译器。 但是,3号线或4号线更好的方法是什么?或者,第3行等于第4行。

谢谢

3 个答案:

答案 0 :(得分:7)

在这种情况下,线条是等效的;操作没有区别。

但是,请注意 - 这并不意味着这些线总是等同的。如果您的数据类型是POD(即简单结构:

struct Foo
{
    int a;
    float b;
};

然后new Foo生成一个未初始化的对象,new Foo()调用一个值初始化构造函数,该值初始化所有字段 - 即在这种情况下将它们设置为0。

因为在这种情况下很容易意外调用new Foo(),忘记初始化对象(这很好!),然后不小心使你的类非POD(在这种情况下,值初始化将不会完成并且该对象将再次未初始化),总是调用new Foo稍微好一点(尽管这会在某些MSVC版本中产生警告)。

答案 1 :(得分:2)

new具有用户声明的构造函数的类型时没有区别。

如果没有,那么第4行将首先将所有成员初始化为零(但仅对那些具有用户声明的构造函数的成员调用构造函数)并对基类执行相同操作。如果您不想这样做,请使用第3行。此规则也适用于具有虚拟成员函数,基类等的复杂对象 - 唯一的条件是该类是否具有用户声明的构造函数。

这是C ++的一个非常微妙的角落,我想如果没有在代码中解释这些事实,我就不会将我的代码建立在这些事实上(哦,亲爱的,我的同事会对我生气)。

答案 2 :(得分:0)