(点击上方公众号可快速关注)
我们在C++程序中经常看到两种new的使用方式:new A以及new A()。那么这两种究竟有什么区别呢
调用new分配的内存有时候会被初始化,而有时候不会这依赖于A的类型是否是POD(Plain old data)类型,或者它是否是包含POD成员、使用编译器生成默认构造函数的类
POD是Plain old data的缩写,它是一个struct或者类且不包含构造函数、析构函数以及虚函数。
维基百科给出了更加详细的解释:
C++的POD类型或者是一个标量值或者是一个POD类型的类。POD class没有用户定义的析构函數、拷贝构造函数和非静态的非POD类型的数据成员而且,POD class必须是一个aggregate没有用户定义的构造函数,没有私有的或者保护的非静态数据没囿基类或虚函数。它只是一些字段值的集合没有使用任何封装以及多态特性。
接着介绍一下C++中的三种初始化方式:
C++03标准中针对这三种方式的说明:
采用如下代码可以验证编译器遵循的到底是哪一种标准:
在VS008中输出就不是0说明遵循的是98标准。
下面先看一段C++示例代码:
上述測试平台是VS2008.需要注意的是VS08只支持C++98。
new A:不确定的值
new B:默认构造(B::m未被初始化)
new B():默认构造(B::m未被初始化)
如果用兼容C++03的编译器比如G++结果:
new A:不确定的值
new B:默认构造(B::m未被初始化)
在所有C++版本中,只有当A是POD类型的时候new A和new A()才会有区别。而且C++98和C++03会有区别。
觉得本文有帮助請分享给更多人
看更多精选C/C++技术文章