zoukankan      html  css  js  c++  java
  • 赋值操作符和拷贝构造函数

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

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

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

  • 相关阅读:
    从干将莫邪的故事说起--java比较操作注意要点
    我又不是你的谁--java instanceof操作符用法揭秘
    色即是空,空即是色---java有关null的几件小事
    大头儿子和小头爸爸的战斗--java字符和字符串
    你的环境有问题吧?--byte数组转字符串的疑惑
    两小无猜的爱恨情仇--java =+和+=揭秘
    java程序猿如何练习java版的易筋经?
    孙悟空的七十二变是那般?--java类型的七十二变揭秘
    leetcode 341. Flatten Nested List Iterator
    leetcode 44. Wildcard Matching
  • 原文地址:https://www.cnblogs.com/zhangnianyong/p/5591327.html
Copyright © 2011-2022 走看看