new对象时加不加括号有什么区别?
new T;
new T();
总结两句话:
- 建议使用
,明确调用构造函数。new T();
- 用
就表示不关心是否初始化,一般后续会有初始化语句。new T;
new T;
的行为不确定,与类定义、编译器实现有关。x详见附录【1】
struct A { int m; }; // POD
// 注:这里与附录不同,增加virtual编译器才生成默认构造函数,可能跟跟编译器版本有关
struct B { virtual ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
In a C++98 compiler, the following should occur:
new A - indeterminate value
new A() - zero-initialize
new B - default construct (B::m is uninitialized)
new B() - default construct (B::m is uninitialized)
new C - default construct (C::m is zero-initialized)
new C() - default construct (C::m is zero-initialized)
In a C++03 conformant compiler, things should work like so:
new A - indeterminate value
new A() - value-initialize A, which is zero-initialization since it's a POD.
new B - default-initializes (leaves B::m uninitialized)
new B() - value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.
new C - default-initializes C, which calls the default ctor.
new C() - value-initializes C, which calls the default ctor.
注:
实际测试结果与上述结果不一致,B和结果用-std=c++98/03/11的行为都一样,分别是uninitialized和zero-initialize。
附录
- https://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new
- https://blog.csdn.net/rainharder/article/details/108325012
- https://blog.csdn.net/rainharder/article/details/108375472