【发布时间】:2023-03-19 15:10:02
【问题描述】:
大多数人可能会建议我使用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
};
谢谢
更新
我想进一步澄清我的问题。下面是我通常初始化动态 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;
}
但请参阅注释行。为什么这不起作用,但它在初始化列表中起作用?
【问题讨论】:
-
下面的自定义数组类使用了一个 C 数组并且它可以工作 ...不,它真的不工作。尝试复制
myArray实例。见rule of three。 -
@Praetorian,我想让课程尽可能简洁。我对这个例子中的任何其他构造函数都不感兴趣。请参阅更新,我在我的问题中添加了更多信息。查看注释掉的行。我想知道为什么注释行只在初始化列表中起作用。
-
这就是 C++ 构造函数初始化程序的工作方式。它类似于构造函数的参数。你读过a good C++ book吗?我强烈推荐 C++ 编程语言。这是一项回报丰厚的投资。
-
注释行无法编译,因为初始化和赋值之间存在差异。 This answer 很好地解释了事情。而且你真的应该从一本书而不是随机代码示例中学习 C++。
-
这是赋值和构造的区别。您只能使用该函数式语法来分配一个值作为构造的一部分。在初始化列表中,它实际上是在构造
elements作为构造myArray实例的一部分。但是,作为函数体中语句的一部分,编译器将其视为调用函数的尝试。
标签: c++ c++11 initializer-list