6 回答

TA貢獻(xiàn)1842條經(jīng)驗 獲得超13個贊
基本上如果你有一個析構(gòu)函數(shù)(不是默認(rèn)的析構(gòu)函數(shù)),這意味著你定義的類有一些內(nèi)存分配。假設(shè)該類在某些客戶端代碼之外或由您使用。
MyClass x(a, b); MyClass y(c, d); x = y; // This is a shallow copy if assignment operator is not provided
如果MyClass只有一些原始類型成員,則默認(rèn)賦值運(yùn)算符可以工作,但如果它有一些指針成員和沒有賦值運(yùn)算符的對象,則結(jié)果將是不可預(yù)測的。因此我們可以說如果在類的析構(gòu)函數(shù)中有刪除的東西,我們可能需要一個深度復(fù)制操作符,這意味著我們應(yīng)該提供一個復(fù)制構(gòu)造函數(shù)和賦值操作符。

TA貢獻(xiàn)1797條經(jīng)驗 獲得超6個贊
我什么時候需要自己申報?
三法則規(guī)定如果你宣布任何一個
復(fù)制構(gòu)造函數(shù)
復(fù)制賦值運(yùn)算符
析構(gòu)函數(shù)
那么你應(yīng)該宣布這三個。它源于這樣的觀察,即接管復(fù)制操作的意義的需要幾乎總是源于執(zhí)行某種資源管理的類,并且?guī)缀蹩偸前凳?/p>
在一個復(fù)制操作中進(jìn)行的任何資源管理可能需要在另一個復(fù)制操作中完成
類析構(gòu)函數(shù)也將參與資源的管理(通常是釋放它)。要管理的經(jīng)典資源是內(nèi)存,這就是為什么管理內(nèi)存的所有標(biāo)準(zhǔn)庫類(例如,執(zhí)行動態(tài)內(nèi)存管理的STL容器)都聲明“三大”:復(fù)制操作和析構(gòu)函數(shù)。
規(guī)則三的結(jié)果是,用戶聲明的析構(gòu)函數(shù)的存在表明簡單的成員明智副本不太可能適合于類中的復(fù)制操作。反過來,這表明如果一個類聲明了一個析構(gòu)函數(shù),那么復(fù)制操作可能不應(yīng)該自動生成,因為它們不會做正確的事情。在采用C ++ 98時,這種推理的重要性并未得到充分認(rèn)識,因此在C ++ 98中,用戶聲明的析構(gòu)函數(shù)的存在對編譯器生成復(fù)制操作的意愿沒有影響。在C ++ 11中仍然如此,但僅僅因為限制生成復(fù)制操作的條件會破壞過多的遺留代碼。
如何防止復(fù)制對象?
將復(fù)制構(gòu)造函數(shù)和復(fù)制賦值運(yùn)算符聲明為私有訪問說明符。
class MemoryBlock
{
public:
//code here
private:
MemoryBlock(const MemoryBlock& other)
{
cout<<"copy constructor"<<endl;
}
// Copy assignment operator.
MemoryBlock& operator=(const MemoryBlock& other)
{
return *this;
}
};
int main()
{
MemoryBlock a;
MemoryBlock b(a);
}
在C ++ 11及更高版本中,您還可以聲明復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符已刪除
class MemoryBlock
{
public:
MemoryBlock(const MemoryBlock& other) = delete
// Copy assignment operator.
MemoryBlock& operator=(const MemoryBlock& other) =delete
};
int main()
{
MemoryBlock a;
MemoryBlock b(a);
}
- 6 回答
- 0 關(guān)注
- 633 瀏覽
添加回答
舉報