如果“Test”是普通类,那么以下之间有什么区别:

Test* test = new Test;

Test* test = new Test();
有帮助吗?

解决方案

让我们变得迂腐一些,因为有些差异实际上会影响代码的行为。以下大部分内容摘自对 《旧事新事》文章.

有时 new 运算符返回的内存会被初始化,有时则不会,具体取决于您要新建的类型是否是 POD(普通旧数据), ,或者如果它是包含 POD 成员并且使用编译器生成的默认构造函数的类。

  • 在 C++1998 中有两种类型的初始化:零和默认值
  • 在 C++2003 中,添加了第三种初始化类型:值初始化。

认为:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

在 C++98 编译器中,应该发生以下情况:

  • new A - 不确定值
  • new A() - 零初始化

  • new B - 默认构造(B::m 未初始化)

  • new B() - 默认构造(B::m 未初始化)

  • new C - 默认构造(C::m 为零初始化)

  • new C() - 默认构造(C::m 为零初始化)

在符合 C++03 的编译器中,事情应该像这样工作:

  • new A - 不确定值
  • new A() - 值初始化 A,它是零初始化,因为它是 POD。

  • new B - 默认初始化(使 B::m 未初始化)

  • new B() - 值初始化 B,它对所有字段进行零初始化,因为它的默认构造函数是编译器生成的而不是用户定义的。

  • new C - 默认初始化 C,它调用默认构造函数。

  • new C() - 值初始化 C,它调用默认的 ctor。

所以在 C++ 的所有版本中,之间存在差异 new Anew A() 因为A是一个POD。

对于这种情况,C++98 和 C++03 之间的行为存在差异 new B().

这是 C++ 中能让你发疯的尘土飞扬的角落之一。当构造一个对象时,有时你想要/需要括号,有时你绝对不能拥有它们,有时它并不重要。

其他提示

new Thing(); 是明确的,你想要一个被调用的构造函数而 new Thing; 意味着你不介意你是否不调用构造函数

如果在具有用户定义构造函数的struct / class上使用,则没有区别。如果调用一个简单的struct / class(例如 struct Thing {int i;}; ),那么 new Thing; 就像 malloc(sizeof(Thing)); new Thing(); 就像 calloc(sizeof(Thing)); - 初始化为零。

陷阱介于两者之间:

struct Thingy {
  ~Thingy(); // No-longer a trivial class
  virtual WaxOn();
  int i;
};

在这种情况下, new Thingy; vs new Thingy(); 的行为在C ++ 98和C ++ 2003之间发生了变化。请参阅Michael Burr关于如何以及为什么的解释。

不,他们是一样的。但是:

之间存在差异
Test t;      // create a Test called t

Test t();   // declare a function called t which returns a Test

这是因为基本的C ++(和C)规则:如果某些事情可能是一个声明,那么它就是一个声明。

编辑:重新解决有关POD和非POD数据的初始化问题,虽然我同意所有已经说过的内容,但我只想指出这些问题仅适用于new'd或以其他方式构造的没有用户定义的构造函数。如果有这样的构造函数,它将被使用。对于99.99%的合理设计类,会有这样的构造函数,因此可以忽略这些问题。

一般来说,第一种情况有默认初始化,第二种情况有值初始化。

例如:如果是 int (POD 类型):

  • int* test = new int - 我们有任何初始化,*test 的值可以是任何。

  • int* test = new int() - *测试的值为 0。

下一个行为取决于您的测试类型。我们有不同的案例:测试有默认构造函数,测试已生成默认构造函数,测试包含 POD 成员、非 POD 成员...

假设Test是一个具有已定义构造函数的类,则没有区别。后一种形式使得Test的构造函数运行起来更加清晰,但就是这样。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top