• c++特殊类


    目录

    1.实现一个只能在堆上创建对象的类(了解思想)

    2.实现一个只能在栈上创建对象的类(同样思想最重要)

    3.单例模式(有实际应用价值)


    1.实现一个只能在堆上创建对象的类(了解思想)

    实现原理:为了不开出静态变量和在栈上开变量有两种方式

    方式一:将析构函数私有,然后手动实现一个有析构功能的成员函数,调用该函数即可。

    方式二:将构造函数私有,然后手动实现一个返回new出来对象的成员函数。比较坑的是,要注意将拷贝构造和赋值都屏蔽掉。因为,在用拷贝构造和赋值时,还会使用构造函数。

    方式一:

    1. #include
    2. using namespace std;
    3. //方式1
    4. class HeapOnly
    5. {
    6. public:
    7. void Delete() //手动实现释放
    8. {
    9. cout << "Delete by myself" << endl;
    10. delete this;
    11. }
    12. private:
    13. ~HeapOnly() //析构私有
    14. {}
    15. int _a;
    16. };
    17. int main()
    18. {
    19. HeapOnly h1;
    20. static HeapOnly h2;
    21. HeapOnly* h3 = new HeapOnly;
    22. h3->Delete();
    23. return 0;
    24. }

    不屏蔽静态和栈上的会报错 。

     

     方式二:

    1. //方式二
    2. class HeapOnly
    3. {
    4. public:
    5. static HeapOnly* GetRet() //手动new一个返回
    6. {
    7. cout << "new by myself" << endl;
    8. HeapOnly* ret=new HeapOnly;
    9. return ret;
    10. }
    11. HeapOnly(const HeapOnly& hp) = delete; //屏蔽拷贝构造和赋值
    12. HeapOnly operator=(const HeapOnly& hp) = delete;
    13. private:
    14. HeapOnly() //构造私有
    15. {}
    16. int _a;
    17. };
    18. int main()
    19. {
    20. //HeapOnly h1;
    21. //static HeapOnly h2;
    22. HeapOnly* h = HeapOnly::GetRet();
    23. return 0;
    24. }


    2.实现一个只能在栈上创建对象的类(同样思想最重要)

    由于,栈不能和堆一样手动写一个函数进行销毁。因此只能私有构造函数。

    1. class StackOnly
    2. {
    3. private:
    4. int _a;
    5. StackOnly()
    6. :_a(0)
    7. {}
    8. public:
    9. static StackOnly GetRet()
    10. {
    11. cout << "get by myself" << endl;
    12. StackOnly ret;
    13. return ret;
    14. }
    15. //上面涉及拷贝(传值返回),所以不能禁用拷贝,因此解决不了创建静态对象的问题。。
    16. /*StackOnly(const StackOnly& st) = delete;
    17. StackOnly operator=(const StackOnly& st) = delete;*/
    18. void* operator new(size_t n) = delete; //可以把new对象屏蔽。
    19. };
    20. int main()
    21. {
    22. //HeapOnly h1;
    23. //static HeapOnly h2;
    24. /*HeapOnly* h = HeapOnly::GetRet();*/
    25. StackOnly st1 = StackOnly::GetRet();
    26. //StackOnly* st2 = new(StackOnly);
    27. return 0;
    28. }


    3.单例模式(有实际应用价值)

    单例模式是指一个类只能创建一个对象。这个实例可以被全局访问,被所有模块共享。

    实现方式1:饿汉模式

    饿汉指的是,无论你是否使用该实例,程序启动就创建一个实例对象。

    1. class singleton
    2. {
    3. public:
    4. singleton* GetInstance()
    5. {
    6. return &m_instance; //方便拿出_instance
    7. }
    8. singleton(const singleton& sl) = delete; //屏蔽掉拷贝和赋值
    9. singleton operator=(const singleton& sl) = delete;
    10. private:
    11. singleton() //只能实例化一次,因此构造一定要私有。
    12. :_a(0)
    13. {}
    14. static singleton m_instance; //静态初始化成员,方便马上直接拿出来。
    15. int _a;
    16. };
    17. singleton singleton::m_instance; //在主程序开始前就实例化
    18. int main()

     优点:简单,不存在线程安全的问题。

    缺点:拖延程序启动时间,如果有多个单例模式初始化的单例顺序不一定准。

    实现方式2:懒汉模式

    懒汉指的是,第一次使用对象时再实例化。

    1. class MemoryPool
    2. {
    3. public:
    4. static MemoryPool* GetInstance()
    5. {
    6. if (_pinst == nullptr)
    7. {
    8. _pinst = new MemoryPool; //用时初始化一次
    9. }
    10. return _pinst;
    11. }
    12. class CGarbo { //内嵌垃圾回收类
    13. public:
    14. ~CGarbo()
    15. {
    16. if (_pinst)
    17. delete _pinst;
    18. }
    19. };
    20. private:
    21. MemoryPool() //只能实例化一次,因此构造一定要私有。
    22. {}
    23. char* _ptr=nullptr;
    24. static MemoryPool* _pinst;
    25. };
    26. MemoryPool* MemoryPool::_pinst = nullptr; //创建单例对象
    27. static MemoryPool::CGarbo gc; //通过调用内嵌类的析构实现资源释放。

    优点:不会拖延程序启动时间,可以确定单例对象实例的循序。

    缺点:复杂,存在线程安全的问题。

  • 相关阅读:
    CMake使用基础汇总
    排序算法(待完善)java版
    洛谷P3200 [HNOI2009]有趣的数列 (卡特兰数)
    基于逻辑回归和神经网络识别手写数字(从0到9)(Matlab代码实现)
    ① MyBatis使用入门,解决IDEA中Mapper映射文件警告。
    docker(3) dockerCompose
    KO88 冲销内部订单
    网络爬虫流程总结
    C语言趣味代码(一)
    javascript正则表达式(语法以及正则表达式修饰符)
  • 原文地址:https://blog.csdn.net/xiao_xiao21/article/details/128056272