2012-01-17 154 views
3

我已經將它鑽入我的腦海許多次,如果提供了複製構造函數,還必須提供賦值運算符。但是,有時候類可以使用複製構造函數,但不能使用賦值運算符。C++複製構造函數和賦值

例如:

class A { 
public: 
    const int myVar; 

    A(const int var) : myVar(var) {}; 
    A(const A& other) : myVar(other.myVar) {}; 
}; 

所以這是一件可怕的事是什麼?是否需要定義賦值運算符,但將其設爲私有?這樣的班級是否仍然可以複製?

+0

這個類甚至不需要一個顯式的拷貝構造函數,因爲編譯器生成一個完全是你想要的。 – 2012-01-17 19:03:59

+0

@ R.MartinhoFernandes:我假設這是一個簡單的代碼示例,用於表示問題。 – 2012-01-17 19:05:46

回答

3

那麼這是一件可怕的事情嗎?
不,它不是。
並非所有類都需要可複製和可分配。具有可複製但不可分配的類是完全有效的。

這樣的類還是可複製構建的嗎?
是的。
只要你的課程提供了一個public拷貝構造函數,你的類就是複製可構造的。

是否需要定義賦值運算符,但需要將其設爲私有?
這取決於您的使用情況。
如果您的班級需要分配,那麼理想情況下應該沒有const成員。

如果您的班級擁有const成員,則默認的編譯器生成的副本賦值運算符將不起作用,因爲它會嘗試分配給不允許的const成員。所以如果你的代碼需要一個複製賦值操作符,你將不得不提供你自己的重載版本。但是,無論如何,這個重載版本不能提供預期的分配語義。

如果您的類對象不需要可賦值,則不要定義它。如果你的代碼不小心使用了它,那麼編譯器會產生一個錯誤。

+0

它不需要分配,但它確實需要是可複製構建的。但我習慣總是被告知它是否有一個複製構造函數,它也必須有一個賦值操作符,但在這裏沒有意義。 – tpg2114 2012-01-17 19:00:39

+0

@ tpg2114:你在這裏提到的是'C++ 03'中的**三級規則**或'C++ 11'中的**規則** **,但它在大多數情況下是準確的這不是標準強制執行的條件(儘管如果標準這樣做會有所幫助)。類可以是可複製的,但不可以賦值,可以在指定案例時打破原則。 – 2012-01-17 19:04:28

+2

三/五條規則允許將一些必需項目聲明爲私有,並使其未實現。但是他們應該被宣佈。你聲明它們是因爲你不希望編譯器爲你產生一些意想不到的事情,不是因爲你打算實際使用它們。 – 2012-01-17 19:11:40

相關問題