【问题标题】:Why does C++ not allow `new` to call constructor when creating arrays为什么C++在创建数组时不允许`new`调用构造函数
【发布时间】:2014-06-10 20:50:23
【问题描述】:

假设您正在堆上创建一个对象数组,如下所示:

myClass * objectPtr = new myClass[10];

new 仅调用默认构造函数,并且(根据我的阅读)不允许调用任何其他构造函数。

new 不能调用任何其他构造函数背后有什么逻辑吗?这样做似乎更好

myClass * objectPtr = new myClass[10](12);

相对

myClass * objectPtr = new myClass[10];
objectPtr[0] = myClass(12);
objectPtr[1] = myClass(12);
...

【问题讨论】:

  • -1 用于原始指针,new 在一行代码中。这个问题也不是特别合理,考虑到它不仅使用原始指针、衰减和无用的分配,而且还关注基本上没有实际意义的原始 C 数组创建。 IOW 的答案可能是“因为不使用 C 数组”(以及所有上述内容)。
  • FWIW,可以通过 std::vector 来做到这一点,例如 std::vector<myClass> foo(10,myClass(12));
  • 为什么这个问题得到了这么多的支持?同情?你们知道你不应该反对其他选票,不是吗?它也允许构造函数调用,所以这个问题是基于一个错误的前提开始的。
  • @RaphaelMiedl 我赞成因为“有效的问题”。如果它被标记为 C++03 会更有趣。我们可以写new int[5](),那为什么不写new int[5](42)
  • @jrok 这正是我对这个问题的一个问题。询问为什么的问题通常不能很好地回答。您可以看到,也没有一个答案真正关注“为什么”部分。

标签: c++ arrays constructor new-operator


【解决方案1】:

为什么C++在创建数组时不允许new调用构造函数

确实如此。只是有点乏味:

struct my_class
{
    my_class() {}
    my_class(int, int) {}   
};

int main() 
{
  my_class* objectPtr = new my_class[3]{my_class(1,2),
                                        my_class(), 
                                        my_class(3,4)};
}

【讨论】:

  • 是就地构造还是在创建的对象上调用复制运算符?
  • @user2612743 这就是我说“乏味”的原因。我只能推测原因,那就是人们无论如何都不应该使用这些东西,而是std::vector<my_class>
  • @user2612743,如果我绝对需要它(虽然我不明白为什么我会这样做),我会使用 BOOST_PP 宏和说实话。
  • 请注意,这不适用于在编译时大小未知的数组。如果你有一个动态数组,我认为这是常见的情况。
【解决方案2】:

通常您不希望多次构造同一个对象,因此您会构造许多默认对象,并使用for 循环您可以根据需要更改它们。

您可以使用的另一种方法是:

myClass **ObjectPointers = new myClass*[NUMBER_OF_OBJECTS];
for (int i=0; i<NUMBER_OF_OBJECTS; ++i)
    ObjectPointers[i] = new myClass(1,2,3,...); # <-- non-default constructor

通过这种方式,您可以动态分配指向可以单独构造的对象的指针。

【讨论】:

  • -1:这让我想起了我在阅读我的第一本也是唯一一本“teach-me-c++”书之后我是如何编写代码的,由于早期的 C 知识,我有些误解了这本书。在你回到 C++ 之前,请认真阅读关于 std::vectors、std::lists 和 smartpointers 的内容。相信我,它会为您省去很多麻烦
  • 我对 STL 库了如指掌,谢谢。但是,我是计算机科学专业的学生,​​当我们练习 C++ 代码时,我们被指示不要使用 STL。不过我完全同意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2013-06-21
相关资源
最近更新 更多