C ++数组是否可以复制构造?

时间:2013-07-07 19:50:17

标签: c++

此代码在C ++中是否有效?

class MyClass    
{
    public:
    Class2 array [100];
    Myclass (const Myclass& other) : array (other.array) {}
};

如果不是,那么获得相同结果的最佳方法是什么?

2 个答案:

答案 0 :(得分:11)

在C ++中,数组不是可显式复制的(不是可复制的,不可赋值的)。您的代码将无法编译。

然而,在C ++中,数组在包装到类中时变得间接可复制。这意味着如果删除构造函数定义,那么编译器为类MyClass生成的隐式复制构造函数实际上将通过一些“神奇”的方式成功复制数组,这些方法是您无法直接使用的。

但是如果由于某种原因你必须显式定义复制构造函数,那么你的选项被限制为让数组默认初始化,然后通过std::copy或类似的东西显式复制构造函数体中的数据。或者您可以简单地重新包装您的数组,这实际上是已经建议的std::array可以为您做的。

答案 1 :(得分:8)

无论这是否有效,如果你的所有复制构造函数都是复制数组,那么我宁愿避免编写它,让编译器隐式生成一个。

另外,我建议在C ++ 11中使用chris's advice并使用std::array而不是C风格的数组:

#include <array>

class MyClass
{
public: // In case you really want this to be public
    std::array<Class2, 100> arr;
};

顺便说一下,这也允许你在复制构造函数的初始化列表中初始化你的数组(但是,再次,只在需要时才这样做):

class MyClass
{
public:
    MyClass() { }
    MyClass (const MyClass& other) : arr(other.arr) {}
//                                   ^^^^^^^^^^^^^^

private:
    std::array<Class2, 100> arr;
};

这是live example