在 C++ 初始化器列表中初始化动态 C 数组

Initialize a dynamic C array within a C++ initializer list

大多数人可能会建议我使用 std::vector 甚至 std::array 但下面的自定义数组 class 使用 C 数组并且它有效,我只需要一些解释至于它为什么有效。

作为参考,下面是初始化动态 C 样式数组的常用方法:

int* elements = new int[size];

下面,我们有自己的自定义数组 class,它在初始化列表中初始化动态 C 样式数组。问题是 我不明白 初始化器列表 .

中的 C 数组是如何被初始化的
class myArray 
{
public:

    myArray(int size) : size(size), elements(new int[size])
    {
        std::cout << "Constructed array of size " << size << std::endl;
    }

    ~myArray()
    {
        delete[] elements;
        std::cout << "Deleted elements" << std::endl;
    }

    int getSize() const { return size; }

private:
    int size;
    int* elements;  // our C style array
};

谢谢

更新

我想再澄清一下我的问题。下面是我通常初始化动态 C 数组的老式 "assignment" 方式:

myArray(int size)
{
    elements = new int[size];
    // elements(new int[size]); // why will line only work in initializer list?
    std::cout << "Constructed array of size " << size << std::endl;
}

但请参阅 注释行。为什么它不起作用但它在初始化列表中起作用?

I don't understand how the C array is being initialized within the initializer list.

此处:

myArray(int size) : size(size), elements(new int[size])

elements 基本上是 new int[size]

返回的赋值

您可以将其重写为:

myArray(int size)
{
    this->size = size;
    elements = new int[size];
    std::cout << "Constructed array of size " << size << std::endl;
}

[编辑]

这个:

// elements(new int[size]); // why will line only work in initializer list?

不会在函数体中起作用,因为在这个地方编译器认为你要调用一个名为elements的函数,但是没有这个函数。

它在初始化列表中起作用的事实是因为语言语法就是这样形成的。

有两种初始化方式。第一种方法是简单的(文字)类型初始化。第二种方式是非平凡类型 init.

有关此类型之间的区别,请参阅 What is a non-trivial constructor in C++?

您还可以看到,如果您手动调用默认构造函数或可以隐式调用默认构造函数,那么琐碎的行为可能会有所不同。这将确定内存是否被分配初始化(zerofill)。

您可以在 Anthony Williams 一书中找到有关隐藏初始化的一些有用信息 "C++ Concurrency in Action: Practical Multithreading"