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


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

    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已经通过默认构造函数构造完成。

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

  • 相关阅读:
    awk实例
    imagemagick imagick
    sort 命令
    cut 命令
    tr命令
    uniq
    多线程编程之Linux环境下的多线程(一)
    多线程编程之Windows同步方式
    多线程编程之数据访问互斥
    多线程编程之基础概念
  • 原文地址:https://www.cnblogs.com/zhangnianyong/p/5591327.html
Copyright © 2020-2023  润新知