类型名称后面的括号与new有区别吗?

如果“测试”是一个普通类,那么以下两者之间是否有任何区别:

测试*测试=新测试;

测试*测试=新测试();

让我们学究一点,因为有一些差异实际上会影响代码的行为。以下大部分内容摘自对一篇“新旧事物”文章的评论

有时,新运算符返回的内存将被初始化,有时则不初始化,这取决于您正在更新的类型是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,有时你绝对不能拥有它们,有时这并不重要

发表评论