使用对象的复制构造函数初始化动态数组对象

时间:2015-02-02 00:13:13

标签: c++ arrays copy-constructor

我正在学习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进行测试。

4 个答案:

答案 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)

=符号在两种情况下使用:

  1. 初始化 - CopyCopy-listaggregate初始化
  2. 分配
  3. 当您编写类似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替换为Tx具有类型T),如果T是默认可构造的并且具有复制构造函数。如果没有,则有一些方法可以指定如何构造Tb类型的对象。您可以在标题为“构造”here的部分中找到相关信息。 请注意,在现代C ++中有更好的方法可以做到这一点,但这不是你的问题所在。

答案 3 :(得分:0)

正如其他答案所指出的那样,最好的选择是使用std::vector,否则你可以使用newdelete,但不建议使用它,因为它很容易出错。如果您刚刚使用delete[]而未使其成为数组,则在使用newdelete创建数组时始终记得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;