赋值操作符和拷贝构造函数

最近开发一个项目,用到了单例模式,头文件大概如下

class CRecGuard
{
public:
CRecGuard(){::InitializeCriticalSection(&cs);Guard();}
~CRecGuard(){UnGuard();::DeleteCriticalSection(&cs);}

private:
void Guard(){::EnterCriticalSection(&cs);}
void UnGuard(){::LeaveCriticalSection(&cs);}

private:
CRITICAL_SECTION cs;
};

template <class T>
class CSingleton
{
public:
static inline T* instance();

private:
CSingleton(){}                   //禁止构造函数
~CSingleton(){}                 //禁止虚构函数
CSingleton(const CSingleton&){}           //禁止复制构造函数
CSingleton & operator= (const CSingleton &){} //禁止赋值拷贝函数

static CRecGuard _gd;
static auto_ptr<T> _instance;
};

template <class T>
auto_ptr<T> CSingleton<T>::_instance;

template <class T>
CRecGuard CSingleton<T>::_gd;

template <class T>
inline T* CSingleton<T>::instance()
{
if(0 == _instance.get())
{
CRecGuard _gd;
if(0 == _instance.get())
{
_instance.reset(new T);
}
}
return _instance.get();
}

其它的东西都比较好理解,就是“禁止复制构造函数”和“禁止赋值拷贝函数”这两个东西,因为这个东西在之前写代码中没怎么用到,于是就是百度一下,于是了解到了“复制构造函数”和“赋值拷贝函数”,赋值拷贝函数和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。 

CTemp a(b); //复制构造函数,C++风格的初始化
CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样 
在这之前a不存在,或者说还未构造好。

CTemp a; 
a=b; //赋值拷贝函数 
在这之前a已经通过默认构造函数构造完成。

知道这两个东西的意思以后,上面的代码就很好理解了,这两个函数后面的{}部分都是空的,这样就起到了禁止的作用。

原文地址:https://www.cnblogs.com/zhangnianyong/p/5591327.html