编写含数组成员的类的拷贝构造函数时遇“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
相关产品推荐
相关产品推荐

