为啥我不能在 C++ 中用 new 调用参数化构造函数?

Posted

技术标签:

【中文标题】为啥我不能在 C++ 中用 new 调用参数化构造函数?【英文标题】:Why can't I call a parameterized constructor with new in c++?为什么我不能在 C++ 中用 new 调用参数化构造函数? 【发布时间】:2011-02-21 20:41:54 【问题描述】:

如果你知道问题,

假设我有一个类 A,它的 CTOR 接收一个整数;

我无法做到以下几点:

A* arr = new A[3](A(2), A(3), A(5));

或任何其他方式来初始化数组的多个成员。 我读了一遍,这是不可能的。

我的问题是为什么,为什么我可以这样做

A arr[3] = A(1), A(2), A(3);

但我不能做到以上?记忆方面的或其他的。

非常感谢!

【问题讨论】:

这些是不同的东西。虽然能够做到这样的事情是有道理的,但我确信这是 C 的一些遗留问题,出于某种原因 C++ 只是“不得不”用 【参考方案1】:

在当前标准 C++(称为 C++03)中不能这样做的原因是历史性的。这将在即将发布的 C++ 标准(目前预计将于今年发布,这将使其成为 C++11)中得到清理,该标准将引入所谓的“统一初始化语法”。

根据Stroustrup's C++0x FAQ,可以接着写

A* p = new A[3] A(1), A(2), A(3);

很有可能您的编译器实际上已经支持这一点。

【讨论】:

统一初始化语法也适用于 new[]? @Thomas:根据www2.research.att.com/~bs/C++0xFAQ.html#uniform-init,确实如此。 有趣。虽然您需要在上面的示例中添加 [] 以匹配问题。 @Thomas:是的,FredO 刚刚在聊天中说服我这样做了……事实上,在真正阅读那个 FAQ 条目之后(而不是仅仅浏览它) 他似乎对动态数组只字未提。 <sigh/> 不管怎样,Fred 发现 GCC 支持这种语法,所以这就是我目前抓住的稻草...... N2215(链接自 BS 的常见问题解答)在第 5 页使用 new int[]1, 2, 3。我还没有在那篇论文中弄清楚它的语义,但我在 N3225 中找不到任何关于它的信息§ 5.3.4 超出该语法允许的语法。【参考方案2】:

我相信您正在尝试执行 C++0x 中包含的“统一初始化”。我不明白为什么初始化列表使用A(int) 部分,我只是这样做(C++98/03 接受:

A arr[3] = 1, 2, 3;

【讨论】:

如果A 是一个具有explicit 构造函数的类,该构造函数采用int,则必须显式调用它进行转换:A(42)。我更喜欢在默认情况下使所有单参数构造函数显式,并且很少偏离。事实上,回顾超过 15 年的 C++,我使用了频率不断降低的隐式转换。原因之一是我不得不回到旧代码并删除它,通常会非常痛苦(需要调整大量代码),因为它会在意想不到的时间出现问题。

以上是关于为啥我不能在 C++ 中用 new 调用参数化构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++:调用无参数的构造函数为啥不加括号

在继承 C++ 中调用 main 中的参数化构造函数

为啥我不能在 C# 中使用基本构造函数 [重复]

c++(在类中)执行buf=new char[i];delete []buf; 为啥没有调用构造和析构函数?

如何在 C++ 中调用基类的参数化构造函数?

直接初试化,拷贝初试化,值初试化