2013-07-07 40 views
4

此代碼在C++中有效嗎?C++數組是否可複製構造?

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

如果不是,達到相同結果的最佳方法是什麼?

+4

使用'std :: array'。 – chris

回答

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

+0

呃,我不認爲OP代碼是有效的。 – jrok

+0

@jrok:爲什麼不呢? (除了丟失分號等) –

+0

上次我嘗試過無法像這樣初始化一個數組。 – jrok

10

在C++數組中不能顯式複製(不可複製構造,不可賦值)。你的代碼不會編譯。

然而,在C++數組中,當被包裝到類中時,它們變成間接可複製的。這意味着如果你刪除了你的構造函數定義,那麼編譯器爲你的類MyClass生成的隱式拷貝構造函數實際上會成功地通過一些「魔術」方法來複制數組,而這些方法直接不可用。

但是,如果由於某種原因,你必須明確地定義拷貝構造函數,那麼你的選擇被限制離開陣列默認初始化,然後通過std::copy或類似的東西明確拷貝構造函數的主體中的數據。或者你可以簡單地重新包裝你的數組,這實際上是已經建議的std::array可以爲你做的。

+0

或者OP可以使用'std :: array <>'並且享受魔法:) –

+0

好吧,我需要明確地定義一個拷貝構造函數。除了數組之外,該類還涉及需要深度複製的其他成員數據。謝謝 :) – jbgs