当前位置: 首页 > news >正文

免费行情软件app网站大全下载免费入口门店管理系统免费版

免费行情软件app网站大全下载免费入口,门店管理系统免费版,泉州专业做网站公司,黄冈网站推广在线观看#x1f493;博主CSDN主页:杭电码农-NEO#x1f493;   ⏩专栏分类:C从入门到精通⏪   #x1f69a;代码仓库:NEO的学习日记#x1f69a;   #x1f339;关注我#x1faf5;带你学习C   #x1f51d;#x1f51d; 单例模式 1. 前言2. 设计一个不能被拷贝/继承的… 博主CSDN主页:杭电码农-NEO   ⏩专栏分类:C从入门到精通⏪   代码仓库:NEO的学习日记   关注我带你学习C   单例模式 1. 前言2. 设计一个不能被拷贝/继承的类3. 只能在堆上创建对象的类4. 只能在栈上创建对象的类5. 只能实例化一个对象的类的介绍6. 饿汉模式的具体实现7. 懒汉模式的具体实现8. 总结以及拓展 1. 前言 在实际场景中,总会遇见一些特殊情况, 比如设计一个类,只能在堆上开辟空间, 亦或者是设计一个类只能实例化一个对象 在实际需求的场景下,来学习这节实用课 本章重点: 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上 创建对象以及此类只能实例化一个对象, 这也就是题目中的单例模式,单例模式又 包含饿汉和懒汉模式,文章都是干货 请同学们耐心学习! 2. 设计一个不能被拷贝/继承的类 设计一个不能被拷贝的类 C11中引入的关键字delete 就能很好的解决这个问题,并且 不仅仅要禁用拷贝,还有赋值! class CopyBan {CopyBan(const CopyBan)delete;CopyBan operator(const CopyBan)delete; };在C98中,也有方法能够解决, 那就是显示将拷贝构造函数和 赋值运算符重载函数私有化! class CopyBan { private:CopyBan(const CopyBan);CopyBan operator(const CopyBan); };设计一个不能被继承的类 使用关键字final就能解决问题 class A final {// .... };在C98中,将构造函数私有化也能 达到目的,因为子类的构造会调用基类 的构造,如果私有了基类的构造就会报错! class NonInherit { private:NonInherit(){} };3. 只能在堆上创建对象的类 只能在堆上创建对象的含义就是 必须使用new来创建对象. 本篇文章是实用性的,就直接讲方法了: 将析构函数私有化 将析构函数私有化后,由于对象析构时并不能调用到析构函数,所以不管是在堆上还是栈上创建对象都会报错!但是我们可以特殊处理,在共有域定义一个函数,此函数显示调用析构! //思路一,封析构函数 class HeapOnly { public:void destory(){delete this;} private:~HeapOnly(){cout调用析构成功!endl;} };能否达到目的大家可以自行测试! 将构造函数私有化 将构造函数设置为私有后,不管是在堆上还是栈上都不能创建对象,但是我们可以在共有域写一个函数显示去调用构造函数,注意,这里的共有域函数必须设置为static类型,因为必须有了对象后才能调用函数,但是要调用了此函数才能创建对象,就会出现先有鸡还是先有蛋的问题,所以设置为static后,可以用类域调用! //思路二,封构造函数 class HeapOnly { public:static HeapOnly* CreateObject(int x 0){return new HeapOnly(x);} private:HeapOnly(int x 0):_x(x){}int _x; };以上两种方案真的就ok了吗? 事实上并不够ok,因为即使封掉了析构 或者是构造,人们也能用拷贝构造或 赋值来在栈上开辟空间,比如在方法二 中,我们可以这样打破规则: HeapOnly* ho1 HeapOnly::CreateObject(10); HeapOnly ho(*ho1);所以在上面两种方案的基础上 要禁用拷贝构造和赋值重载两个函数! 4. 只能在栈上创建对象的类 有了前面的思想,解决这个类型 的问题就显示很小儿科了! 同上将构造函数私有化然后设计 静态方法创建对象返回对象即可 class StackOnly { public:static StackOnly CreateObj(){return StackOnly();}// 禁掉operator new可以把下面用new 调用拷贝构造申请对象给禁掉 // StackOnly obj StackOnly::CreateObj(); // StackOnly* ptr3 new StackOnly(obj);void* operator new(size_t size) delete;void operator delete(void* p) delete; private:StackOnly() :_a(0){}private:int _a; };5. 只能实例化一个对象的类的介绍 一个类只能实例化一个对象 这就是大名鼎鼎的单例模式 谈单例模式前,先谈设计模式: 单例模式就是设计模式中的一种: 单例模式在实际场景下使用非常广泛 如果你恰好在读我的并发内存池项目 亦或者是你学过线程池(thread pool), 这里都能看见单例模式的影子,并且, 单例模式有两种实现模式: 饿汉模式:就是说不管你将来用不用程序启动时就创建一个唯一的实例对象懒汉模式:第一次使用时才创建一个唯一的实例对象 6. 饿汉模式的具体实现 注意,这里实现的是样例(demo)代码,在 不同的工程场景下需要大家做灵活的变换 // 饿汉模式 // 优点简单 // 缺点可能会导致进程启动慢且如果有多个单例类对象实例启动顺序不确定。 class Singleton { public:static Singleton* GetInstance(){return _ins;} private://限制类外随意创建对象Singleton(const Singleton s) delete;Singleton operator(const Singleton s) delete;Singleton(){} private:static Singleton* _ins; }; Singleton* Singleton::_ins new Singleton;单例模式的饿汉模式中,程序一启动就会 把_ins,也就是唯一的实例对象给初始化, 并且由于构造函数被私有了,只能调用共 有的GetInstance()函数获取_ins对象,又 由于这个对象是static类型的,所以不管你 调用多少次GetInstance()都获取的是同 一个对象,也就是_ins 7. 懒汉模式的具体实现 //懒汉模式 class Singleton { public:static Singleton* GetInstance(){if (_ins nullptr)//双检查加锁,只有第一次进来时需要加锁,其他情况不用加锁{imtx.lock();if (_ins nullptr)//第一次调用才创建实例!{_ins new Singleton;}imtx.unlock();}return _ins;}void DelInstance(){imtx.lock();if (_ins ! nullptr){cout over!!! endl;delete _ins;_ins nullptr;}imtx.unlock();} private://限制类外随意创建对象Singleton(const Singleton s) delete;Singleton operator(const Singleton s) delete;Singleton(){} private:static Singleton* _ins;static mutex imtx; }; Singleton* Singleton::_ins nullptr; mutex Singleton::imtx;与饿函数模式不同的是,懒汉模式在多线程 情况下有线程安全问题,所以在第一次拿唯 一的对象前需要加锁,并且对象在程序启动 时被置空了,只有调用了GetInstance()才会 真正的分配空间 当然,这两个模式都是样例代码,大家要随机应变 8. 总结以及拓展 特殊类的设计这块儿,大家需要在写某些 项目的时候真正运用到它才能体会出它 的作用和奥妙之处,总的来说单例模式是 使用很广泛并且很有用的一种设计模式! 对设计模式的拓展: 常见的设计模式不仅仅有单例模式,还有工厂模式、抽象工厂模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、观察者模式和命令模式等,如果大家有兴趣的话可以阅读这篇文章拓展自己的知识 C常见的11种设计模式 下期预告:C类型转换以及IO流
http://www.w-s-a.com/news/237500/

相关文章:

  • 专门做lolh的网站wordpress 模版 cho's
  • 网上做设计兼职哪个网站好点网站开发毕业周记
  • 自学商城网站建设无为网页定制
  • wordpress全站cdn手机网站调用分享
  • 淄博做网站58同城wordpress微信号订阅
  • 不同的网站 做301公共资源交易中心是干嘛的
  • 36 氪 网站如何优化怎么优化自己的网站
  • 网站兼容问题湖北网站建设优化
  • 2018新网站做外链app制作的网站
  • 外贸网站建设怎么建设pc网站做移动端适配
  • 做经销找厂家好的网站个人备案网站可以做电影站吗
  • 网站搭建怎么做网站建设培训哪家好
  • 学做美食的视频网站企业网站备案密码怎么找回
  • 销售产品做单页还是网站seo有哪些作用
  • 网站视觉规范南宁网站优化推广
  • 公司起名打分最准的免费网站学设计的学校
  • 用cn作网站行么WordPress网站打不开nginx
  • 顺德龙江网站建设百货商城自助下单网站
  • 门户网站采用较多的模式是wordpress自动搜索缩略图
  • 深圳设计功能网站做网站推广怎么做
  • 海口专业网站建设地址wordpress站点标题是什么
  • 青岛做网站那家好网页素材网
  • 宁夏银川做网站的公司网络营销有哪些推广方法
  • 免费域名网站哪个最好东莞企业网站排名
  • dz做网站网址模版
  • 做外贸网站平台中华室内设计师网
  • 三大网络架构seo是啥职业
  • 一个域名可以做中英文两个网站吗搜索引擎营销的6种方式
  • 可以做ppt的网站天津网站建设怎么样
  • 网站怎么做的qq邮件订阅浙江省住房和城乡建设厅网站查询