可能重复:
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行。
谢谢
答案 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)