4

此代码在 C++ 中有效吗?

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

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

4

2 回答 2

11

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

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

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

于 2013-07-07T20:10:31.727 回答
8

不管这是否有效,如果您的复制构造函数所做的只是复制数组,那么我宁愿避免编写它并让编译器隐式生成一个。

另外,我建议在 C++11 中遵循chris 的建议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;
};

这是一个活生生的例子

于 2013-07-07T19:53:11.183 回答