天天看点

new T加不加括号的区别附录

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。

附录

  1. https://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new
  2. https://blog.csdn.net/rainharder/article/details/108325012
  3. https://blog.csdn.net/rainharder/article/details/108375472

继续阅读