使用 new 分配的数组不能有初始化器吗?

发布于 2024-11-23 20:20:34 字数 162 浏览 0 评论 0原文

在我目前正在阅读的书中(Herbert Schildt 的C++ Complete Reference)中,它说使用 new 分配的数组不能有初始化程序。

我不能使用 new 初始化动态分配的数组吗?如果不是的话原因是什么?

In the book I am reading at the moment (C++ Complete Reference from Herbert Schildt), it says that no array allocated using new can have an initializer.

Can't I initialize a dynamically allocated array using new? If not whats the reason for it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

世态炎凉 2024-11-30 20:20:34

这并不完全正确(您几乎肯定应该为自己找到一个替代参考),您可以使用一个空的初始化程序(()),它将值初始化数组,但是是的,使用 array new 时不能单独初始化数组元素。 (参见 ISO/IEC 14882:2003 5.3.4 [expr.new] / 15)

例如,

int* p = new int[5](); // array initialized to all zero
int* q = new int[5];   // array elements all have indeterminate value

没有根本原因不允许使用更复杂的初始化程序,只是 C++03 没有语法构造。在 C++ 的下一个版本中,您将能够执行类似的操作。

int* p = new int[5] {0, 1, 2, 3, 4};

That's not quite true (you should almost certainly get yourself an alternative reference), you are allowed an empty initializer (()) which will value-initialize the array but yes, you can't initialize array elements individually when using array new. (See ISO/IEC 14882:2003 5.3.4 [expr.new] / 15)

E.g.

int* p = new int[5](); // array initialized to all zero
int* q = new int[5];   // array elements all have indeterminate value

There's no fundamental reason not to allow a more complicated initializer it's just that C++03 didn't have a grammar construct for it. In the next version of C++ you will be able to do something like this.

int* p = new int[5] {0, 1, 2, 3, 4};
放肆 2024-11-30 20:20:34

这本书是正确的;你不能拥有,

int *p = new int[3](100);

其背后没有可理解的原因。这就是为什么我们在 C++0x 中有数组初始值设定项。

The book is correct; you cannot have,

int *p = new int[3](100);

There is no understandable reason behind it. That's why we have initializers for array in C++0x.

七月上 2024-11-30 20:20:34

我认为这本书是正确的,一般来说你不能用当前版本的 C++ 做到这一点。
但是您可以使用 boost::assign 来实现动态数组,请参见下文

#include <boost/assign/list_of.hpp>
class Object{
public:
    Object(int i):m_data(i){}
private:
    int m_data;
};

int main()
{
    using namespace boost::assign;
    std::vector<Object> myvec = list_of(Object(1))(Object(2))(Object(3));
}

I think the book is correct, in generally you cannot do that with current version of c++.
But you can do that with boost::assign to achieve a dynamic array, see below

#include <boost/assign/list_of.hpp>
class Object{
public:
    Object(int i):m_data(i){}
private:
    int m_data;
};

int main()
{
    using namespace boost::assign;
    std::vector<Object> myvec = list_of(Object(1))(Object(2))(Object(3));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文