• C++中实现一些特殊的类|设计模式



    1.设计一个类 不能被拷贝

    拷贝只会发生在两个场景中:拷贝构造以及赋值运算符重载。想要让一个类禁止拷贝,只需要该类不能调用拷贝构造和赋值运算符重载

    1. c++98中 将拷贝构造与赋值运算符重载只声明不定义,不定义是因为该函数根本不会调用,定义了也没有意义,而且如果定义了就不会防止成员函数内部拷贝了。并且将访问权限设为私有。设置为私有:如果只声明没有设置为private,用户自己在类外定义了,就不能禁止拷贝了
    2. c++11中扩展delete的用法,delete除了释放new申请的资源外,如果默认成员函数后面=delete,表示让编译器删除掉该默认成员函数
    1. class copyBan
    2. {
    3. //...
    4. private:
    5. copyBan(const copyBan&);
    6. copyBan& operator=(const copyBan&);
    7. //...
    8. };
    9. class copyBan
    10. {
    11. //...
    12. copyBan(const copyBan&) = delete;
    13. copyBan& operator=(const copyBan&) = delete;
    14. //...
    15. };

    2.设计一个类,在堆上创建

    实现方式:

    1.将析构函数设置为私有

    编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存

    2.将构造函数设置为私有,拷贝构造声明称私有,防止别人调用拷贝在栈上生成对象,提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建

    1. //1.析构私有
    2. class A
    3. {
    4. public :
    5. A(){}
    6. void destory(){ delete this ;}
    7. private :
    8. ~A(){}
    9. };
    10. //2.构造私有
    11. class A
    12. {
    13. public:
    14. static getObj()
    15. {
    16. A* p = new A();
    17. return p;
    18. }
    19. }
    20. private:
    21. A(){}
    22. public:
    23. ~A(){}
    24. };

    3.设计一个类,在栈上创建

    1.将构造函数私有化,设计静态方法创建对象返回

    1. class StackOnly
    2. {
    3. public:
    4. static StackOnly CreateObj()
    5. {
    6. return StackOnly();
    7. }
    8.    
    9.  
    10. void* operator new(size_t size) = delete;
    11. void operator delete(void* p) = delete;
    12. private:
    13. StackOnly()  
    14. :_a(0)
    15. {}
    16. private:
    17. int _a;
    18. };

    4.设计一个类,不能被继承

    1. c++98中将构造函数设置为私有,派生类中调不到基类的构造函数,则无法继承
    2. c++11使用final关键字,final修饰类,表示该类不能被继承
    1. c++98:
    2. class nonInherit
    3. {
    4. public:
    5. private:
    6. nonInherit()
    7. {}
    8. };
    9. c++11
    10. class A final
    11. {
    12. };

    5.设计一个类,只能创建一个对象(单例模式)

    设计模式

    设计模式是一套被反复使用,代码设计经验的总结。设计设计模式,为了代码可重用性,让代码更容易被理解,保证代码的可靠性。设计模式使代码编写真正工程化

    单例模式:

    一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例模式对象统一读取,然后服务进程中其他对象再通过这个单例对象获取这些配置信息,这种方式简化了再复杂环境下的配置管理。

    单例模式有两种实现模式:

    饿汉模式:不管将来是否使用,程序启动时就创建一个唯一的实例对象

    1. class singleTon
    2. {
    3. public:
    4. static singleTon * getInstance()
    5. {
    6. return _ins;
    7. }
    8. void add(const string& str)
    9. {
    10. _v.push_back(str);
    11. ++_n;
    12. }
    13. void Print()
    14. {
    15. for(auto& e:_v)
    16. {
    17. cout<
    18. }
    19. }
    20. private:
    21. singleTon()
    22. {
    23. }
    24. private:
    25. int _n = 0;
    26. vector<int> _v; //想让vector全局只有一份
    27. //限制在类外随意创建对象
    28. static singleTon * _ins;
    29. }
    30. static singleTon:: singleTon * _int = new singleTon;
    31. int main()
    32. {
    33. singleTon s1;
    34. return 0;
    35. }

    懒汉模式:如果单例对象构造十分耗时或者消耗很多资源,比如加载插件,初始化网络连接,读取文件等,而且有可能该对象程序运行时不会用到,那么程序如果一开始就初始化,导致程序启动十分缓慢,这种情况使用懒汉模式(延迟加载)更优

  • 相关阅读:
    dialogx,给大家推荐一个开源安卓弹窗组件。
    Stable Diffusion中的embedding
    基于STM32设计的动态密码锁
    既然有了ES,为何还用ClickHouse——从原理万字总结ClickHouse为何这么快
    动态链接库--导出类(二)
    WMware Tools安装失败segmentation fault解决方法
    【老生谈算法】matlab实现传染病模型源码——传染病模型
    论语第一篇-学而
    深入探讨梯度下降:优化机器学习的关键步骤(三)
    .NET周刊【4月第2期 2024-04-21】
  • 原文地址:https://blog.csdn.net/jolly0514/article/details/133209636