如果“测试”是一个普通类,那么以下两者之间是否有任何区别:
Test* test = new Test;
and
Test* test = new Test();
让我们学究一点,因为有一些差异实际上会影响代码的行为。以下大部分内容摘自对一篇“新旧事物”文章的评论。 有时,新操作符返回的内存将被初始化,有时则不取决于您要更新的类型是POD(纯旧数据),还是包含POD成员并使用编译器生成的默认构造函数的类。 在C1998中,有两种类型的初始化:零和默认 在C2003中,添加了第三种类型的初始化,即值初始化。 假设:
struct A { int m; }; // POD struct B { ~B(); int m; }; // non-POD, compiler generated default ctor struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
在C++98编译器中,应发生以下情况: new A-不确定值 new A()-零初始化 new B-默认构造(B::m未初始化) new B()-默认构造(B::m未初始化) new C-默认构造(C::m初始化为零) new C()-默认构造(C::m为零初始化)
在符合C03的编译器中,情况应该是这样的: new A-不确定值 new A()-值initialize A,这是零初始化,因为它是一个POD。 new B-默认初始化(使B::m未初始化) new B()-value初始化B,该值为零初始化所有字段,因为它的默认ctor是编译器生成的,而不是用户定义的。 new C-default初始化C,它调用默认的ctor。 new C()-value初始化C,它调用默认的ctor。 因此,在所有版本的C中,new a和new a()之间都有区别,因为a是一个POD。 对于case new B(),C98和C03之间的行为有所不同。 这是C++的一个尘土飞扬的角落,会让你发疯。在构建一个对象时,有时你想要/需要paren,有时你绝对不能拥有它们,有时这并不重要。