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的派生类中使用这两个函数,就必须在派生类中去真正实现它们。

 

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