您的位置:首页 > 移动开发 > Objective-C

CObject类是怎样禁用operator=和拷贝构造函数

2010-11-05 14:58 127 查看
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的派生类中使用这两个函数,就必须在派生类中去真正实现它们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: