大多数人可能会建议我使用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;
}
但请参阅评论专栏。为什么这不起作用,但它在初始化列表中有效?
答案 0 :(得分:3)
我不明白如何在初始化列表中初始化C数组。
这里:
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
的函数,但是没有这样的函数。
它在初始化列表中的作用是因为这就是语法语法的制作方式。
答案 1 :(得分:1)
有两种初始化方式。第一种方法是简单(文字)类型初始化。第二种方式是非平凡的类型init。
有关此类型之间的差异,请参阅What is a non-trivial constructor in C++?
另外,您可以看到,如果手动调用默认构造函数或者可以隐式调用它,那么琐碎的行为可能会有所不同。这将确定是否使用分配初始化(zerofill)内存。
有关隐藏初始化的一些有用信息,您可以在书中找到Anthony Williams&#34; C ++ Concurrency in Action:Practical Multithreading&#34;