此代码在C ++中是否有效?
class MyClass
{
public:
Class2 array [100];
Myclass (const Myclass& other) : array (other.array) {}
};
如果不是,那么获得相同结果的最佳方法是什么?
答案 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。