我是不提倡C++当中使用单例模式的,在很早以前写过一个答案提过关于单例的问题。
正好最近有个朋友刚翻译了C++ core guidelines,里面的I.3也提了单例模式的危害,直接用“避免单例”作为标题,今天可以稍微展开聊聊为什么单例在C++中不推荐。最近很多小伙伴找我,说想要一些C++资料,然后我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「C++专业入门到高级教程+工具包」,点个关注,全部无偿共享给大家!!!
评论区回复“888”,关注我之后私信回复“666”,即可拿走。
首先,我们得先讨论全局变量的危害。由于全局变量完全破坏了RAII的封装性,像神一样直接干涉万物。在C++ core guidelines里列举了以下四点:
你无法孤立地测试你的实体。如果单元不存在,那么单元测试也将不存在。你只能进行系统测试。实体的执行效果要依赖整个系统的状态。
因为你无法孤立地对代码进行推理,重构它会相当有挑战。
你无法轻易地重新安排函数的调用或者在不同的线程上进行函数调用,因为可能有隐藏的依赖。缓存之前的函数调用结果也极为危险。
产生数据竞争的必要条件是有共享而可变的状态,而非const全局变量正是共享而可变的。
拾人牙慧部分结束:
代码要对输入输出负责,当依赖全局的变量来作为输入或者输出的单元的时候,谁也不知道有谁的恶心代码用什么恶心的姿势把全局变量的值在啥时候给tm改了。可测试性无从谈起,可重用性基本为0,模块化、可维护性也几乎为零,可读性荡然无存。