如果“测试”是一个普通类,那么以下两者之间是否有任何区别:
测试*测试=新测试;
及
测试*测试=新测试();
让我们学究一点,因为有一些差异实际上会影响代码的行为。以下大部分内容摘自对一篇“新旧事物”文章的评论
有时,新运算符返回的内存将被初始化,有时则不初始化,这取决于您正在更新的类型是POD(普通旧数据),还是包含POD成员并使用编译器生成的默认构造函数的类
- 在C++1998中,有两种类型的初始化:零和默认
- 在C++2003中,添加了第三种类型的初始化,即值初始化
假设:
结构A{int m;};//豆荚
结构B{~B();int m;};//非POD,编译器生成的默认ctor
结构C{C():m(){};~C();int m;};//非POD,默认初始化为m
在C++98编译器中,应发生以下情况:
新A-不确定值-
新建A()-零初始化 -
新建B-默认构造(B::m未初始化) -
new B()-默认构造(B::m未初始化) -
新建C-默认构造(C::m为零初始化) newc()-默认构造(C::m为零初始化)
在符合C++03的编译器中,情况应该是这样的:
新A-不确定值-
新建A()-值初始化A,这是零初始化,因为它是一个POD -
新建B-默认初始化(使B::m未初始化) -
new B()-值初始化B,其中零初始化所有字段,因为它的默认构造函数是编译器生成的,而不是用户定义的 -
新建C-默认值初始化C,它调用默认的ctor new C()-值初始化C,它调用默认的ctor
P>所以在C++的所有版本中,新A/和新A.()/之间有区别,因为A是POD。
在C++98和C++03之间,对于案例new B(),在行为上存在差异
这是C++中的一个满是灰尘的角落,会让你发疯的。当构建一个对象时,有时你想要/需要paren,有时你绝对不能拥有它们,有时这并不重要