CObject類是怎樣禁用operator=和拷貝構造函數


class CObject
{
public:
 virtual ~CObject();  // virtual destructors are necessary

 

  // Disable the copy constructor and assignment by default so you will get
 //   compiler errors instead of unexpected behaviour if you pass objects
 //   by value or assign objects.
protected:
 CObject();              
private:
 CObject(const CObject& objectSrc);              // no implementation
 void operator=(const CObject& objectSrc);       // no implementation

};

 

我們看到

1:CObject類的構造函數都不是public類型,因此我們沒能直接去定義一個CObject類型的對象,而必須要用CObject類的派生類去定義定義個對象。

2:爲什麼CObject();是protected類型而不是private類型呢?

這是因爲,CObject類的派生類在定義對象時,只能調用CObject的public類型或protected類型的構造函數,而不能CObject類型的構造函數。

看MFC源代碼:

// CObject
_AFX_INLINE CObject::CObject()
 { }
_AFX_INLINE CObject::~CObject()
 { }

3:

private:
 CObject(const CObject& objectSrc);              // no implementation
 void operator=(const CObject& objectSrc);       // no implementation

拷貝構造函數和賦值運算符重載函數在CObject只進行了聲明而並沒有去真正實現它們。只要我們的程序不去調用CObject類的這兩個函數,那麼程序就不會報錯。一旦我們在程序中調用了這兩個函數中的某一個,程序立馬就會報錯。

在這裏,MFC之所以只在CObject類中聲明瞭這兩個函數而並沒有去實現他們,這是爲了防止在CObject的派生類中出現與“淺拷貝和深拷貝”相關的錯誤。如果我們想在CObject的派生類中使用這兩個函數,就必須在派生類中去真正實現它們。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章