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

时间:2017-01-04 18:38:35

标签: c++ c++11 initializer-list

大多数人可能会建议我使用std::vector甚至是std::array,但下面的自定义数组类使用C数组并且它可以正常工作,我只需要解释一下它的工作原理。

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

int* elements = new int[size];

现在,我们有自己的自定义数组类,初始化初始化列表中的动态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
};

谢谢

更新

我想再澄清一下我的问题。以下是老式的&#34;任务&#34;我通常会初始化动态C数组的方式:

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;
}

但请参阅评论专栏。为什么这不起作用,但它在初始化列表中有效?

2 个答案:

答案 0 :(得分:3)

  

我不明白如何在初始化列表中初始化C数组。

这里:

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

elementsnew 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的函数,但是没有这样的函数。

它在初始化列表中的作用是因为这就是语法语法的制作方式。

答案 1 :(得分:1)

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

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

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

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