You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写含数组成员的类的拷贝构造函数时遇“array used as initializer”错误

解决C++拷贝构造函数中“array used as initializer”错误

你遇到的问题是因为C++原生数组不支持直接用另一个数组进行初始化,必须通过元素拷贝的方式实现。以下是几种可行的解决办法:

方法1:手动循环拷贝元素

在拷贝构造函数体内逐个复制数组元素:

class A
{
    int arr[10];

public:
    A() : arr{10, 20, 30, 40, 50, 60, 70, 80, 90, 100} {}
    A(int n) : arr{n, n, n, n, n, n, n, n, n, n} {}
    A(const A &ref) {
        for (int i = 0; i < 10; ++i) {
            arr[i] = ref.arr[i];
        }
    }
};

方法2:使用标准库std::copy算法

借助<algorithm>头文件中的std::copy,代码更简洁:

#include <algorithm>

class A
{
    int arr[10];

public:
    A() : arr{10, 20, 30, 40, 50, 60, 70, 80, 90, 100} {}
    A(int n) : arr{n, n, n, n, n, n, n, n, n, n} {}
    A(const A &ref) {
        std::copy(std::begin(ref.arr), std::end(ref.arr), std::begin(arr));
    }
};

方法3:使用memcpy快速拷贝

如果数组元素是POD类型(比如int),可以用<cstring>中的memcpy直接复制内存:

#include <cstring>

class A
{
    int arr[10];

public:
    A() : arr{10, 20, 30, 40, 50, 60, 70, 80, 90, 100} {}
    A(int n) : arr{n, n, n, n, n, n, n, n, n, n} {}
    A(const A &ref) {
        memcpy(arr, ref.arr, sizeof(arr));
    }
};

方法4:改用std::array(推荐)

将原生数组替换为std::array(需包含<array>头文件),它支持值语义,可以直接在初始化列表中拷贝:

#include <array>

class A
{
    std::array<int, 10> arr;

public:
    A() : arr{10, 20, 30, 40, 50, 60, 70, 80, 90, 100} {}
    A(int n) : arr{n, n, n, n, n, n, n, n, n, n} {}
    A(const A &ref) : arr(ref.arr) {} // 此写法合法
};

错误原因说明

C++原生数组属于不可拷贝类型,无法像普通变量那样直接通过arr(ref.arr)的方式初始化。必须手动复制每个元素,或者使用支持拷贝的容器(如std::array)替代原生数组。

内容的提问来源于stack exchange,提问作者Pisers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:05:26