我正在学习C ++,而且我正在搞乱构造函数/运算符。
我有一个数组:
int x(1);
int a[] = { int(x), int(x), int(x) };
如何使用对象的复制构造函数动态构造相同的数组?我也不想使用=运算符。
类似于:
int* b;
for (int i = 0; i < DESIRED_ARRAY_SIZE; i += 1)
{
b[i](int(x));
}
当然以上不起作用。这完全是出于学习目的,所以我想知道这是否可行。我也想知道是否存在基元与类的特殊情况,因为我目前正在使用int
atm进行测试。
答案 0 :(得分:0)
你问:
如何使用对象的复制构造函数动态构造相同的数组?
假设您的类型不同于int
具有复制构造函数的类型,您可以使用:
X x(1);
X arr[] = {x, x, x, x};
你说:
我也不想使用=运算符。
如果您可以选择使用std::vector
,则可以使用:
std::vector<X> arr(10, x);
如果因某种原因无法使用std::vector
,您可以使用:
// Create an array objects. The object will be created using
// the default constructor.
X* arr = new X[DESIRED_ARRAY_SIZE];
for (int i = 0; i < DESIRED_ARRAY_SIZE; i += 1)
{
arr[i] = x; // This will use the copy assignment operator,
// not the copy constructor.
}
答案 1 :(得分:0)
在C ++中,动态数组被称为vector
和(从C ++ 11开始)你可以写:
vector<int> a = { x, x, x };
强制转换是多余的,int(x)
与x
相同,因为x
已经是int。 (那没有指定副本)。
初始化程序列出按值复制。
在您的第二个示例中,代码为:
vector<int> b(DESIRED_ARRAY_SIZE, x);
答案 2 :(得分:0)
=
符号在两种情况下使用:
当您编写类似int a[] = {1,2,3}
的内容时,它是聚合初始化。如果要动态构造数组,可以使用new[]
动态分配数组,然后继续复制分配此数组的元素。你这样做:
int* b = new int[DESIRED_ARRAY_SIZE];
for (int i = 0; i < DESIRED_ARRAY_SIZE; i += 1)
{
b[i] = x;
}
使用基本类型(如int
)和类类型(例如T
)之间存在差异。在上面的代码段中,您可以将int
替换为T
(x
具有类型T
),如果T
是默认可构造的并且具有复制构造函数。如果没有,则有一些方法可以指定如何构造T
中b
类型的对象。您可以在标题为“构造”here的部分中找到相关信息。
请注意,在现代C ++中有更好的方法可以做到这一点,但这不是你的问题所在。
答案 3 :(得分:0)
正如其他答案所指出的那样,最好的选择是使用std::vector
,否则你可以使用new
和delete
,但不建议使用它,因为它很容易出错。如果您刚刚使用delete[]
而未使其成为数组,则在使用new
和delete
创建数组时始终记得new
。考虑一下有关std::vector
处理动态分配的其他答案。如果没有一个答案是你正在寻找的,那么也许你需要重新解释你的问题。
int* p_array = new int[3]; // '3' would be the array length
for (int i{0}; i != 3; ++i)// I'm not naming the arr length in this example.
p_array[i] = i;
delete[] p_array;