在 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"
大多数人可能会建议我使用 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"