为啥我不能在 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 调用参数化构造函数?的主要内容,如果未能解决你的问题,请参考以下文章