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的派生类中使用这两个函数,就必须在派生类中去真正实现它们。
{
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的派生类中使用这两个函数,就必须在派生类中去真正实现它们。
相关文章推荐
- 怎样在专业路由器中实现禁用BT (转)
- 怎样在专业路由器中实现禁用BT (转)
- JAVA中Object类 equals()方法和“==”怎样区别
- 怎样在专业路由器中实现禁用BT (转)
- 易宝典文章——怎样重新连接 ExchangeServer 2013中被禁用邮箱 推荐
- IE浏览器怎样禁用js(javascript)
- 怎样禁用UEFI boot option中的USB启动,防止U盘WIN PE系统黑入电脑?
- 怎样在专业路由器中实现禁用BT (转)
- 对拷贝构造函数与operator=的理解
- 客户端禁用cookie,怎样实现session共享多个页面
- 怎样解决“在禁用UAC时,无法激活此应用”问题
- 如何禁用拷贝构造函数和禁用重载赋值运算符
- 怎样在专业路由器中实现禁用BT (转)
- Win7怎样禁用自带IE浏览器
- 怎样禁用Windows Update功能
- 怎样让WinForm里的窗体禁用最大化
- 禁用拷贝构造函数和重载赋值运算符
- c++怎样让返回对象的函数不调用拷贝构造函数
- 怎样在专业路由器中实现禁用BT (转)
- 怎样高速编译mediatek\operator以下代码