new T加不加括号的区别

tech2022-09-13  107

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-newhttps://blog.csdn.net/rainharder/article/details/108325012https://blog.csdn.net/rainharder/article/details/108375472
最新回复(0)