呼叫新节点' vs' new node()'

时间:2014-03-14 08:52:13

标签: c++ arrays dynamic constructor allocation

如果您有new node;new node(); 两者都以相同的方式调用相同的构造函数?可以有一个实现,其中两个会调用不同的构造函数吗?

另外,如果我想创建多个实例,即new node [5];,是否有办法使用带有传递参数的重载构造函数来执行此操作?

3 个答案:

答案 0 :(得分:1)

node* n = new node;   // 1
node* n = new node(); // 2
  

可以有一个实现,其中两个会调用不同的构造函数吗?

1默认初始化2值初始化。会发生什么取决于node的类型。

如果是内置类型,则第一个版本将*n的值保留为未初始化状态。第二个结果是零初始化

如果它是聚合,1会使内置类型的数据成员未初始化,2会将它们归零。用户定义类型的成员将获得默认构造。

如果它是具有默认构造函数的(非聚合)用户定义类型,则在两种情况下都将调用默认构造函数。

  

另外,如果我想创建多个实例,即新节点[5];

是的,除非你坚持使用预C ++ 11编译器。例如,

struct Foo
{
  int i;
  Foo(int i) : i(i) {}
};

Foo* f = new Foo[3] {1, 2, 3};

答案 1 :(得分:0)

您可以通过编写一个在构造函数中打印内容的简单类来轻松地检查这一点。

是,

new node;

new node();

调用相同的构造函数。

答案 2 :(得分:0)

第一个问题,new node;new node();将调用相同的默认构造函数。

第二个问题,简答:使用std::vector<node>

如果必须使用数组,可以在C ++ 11中使用扩展初始化列表

new node[5]{node(0), node(1), node(2), node(3), node(4)};