EffectiveC++条款04:确定对象被使用前已先被初始化
2024-09-03 23:50:00
不要混淆赋值和初始化,对于大多数类型而言,比起先调用默认构造函数然后调用赋值操作符,只调用一次拷贝构造函数是高效的
对于内置类型,也需要成员初值列(member initialization list)来初始化,对于const和reference,则是必须的
基类先于子类先初始化,class的成员变量初始化的顺序是以其声明的次序被初始化
不同编译单元内定义的non-local static对象
static对象包括global对象,定义于namespace,class,函数以及file作用域被声明为static对象
函数内的static对象称为local static对象,其他称为non-static对象,程序结束时,static对象被销毁,也就是它们的析构函数会在main()结束时被调用
C++不同编译单元内定义的non-local static对象的初始化相对次序并无明确定义
可以在设计上消除这个问题:将每个non-local static对象搬到自己的专属函数内(该对象在函数内被声明为static),然后函数返回其引用,non-local static对象便被local static对象替换了,这是Singleton模式常用的手法
任何non-const static对象,不论它是否是local还是non-local,在多线程下等待某事发生都会发生麻烦,处理这种麻烦的一种做法是在程序的单线程启动阶段,就手工调用所有reference-returning函数,可消除与初始化有关的竞态(race conditions)
请记住
- 为内置类型对象进行手工初始化,C++不保证初始化它们
- 构造函数最好使用成员初值列,成员变量的排列次序应该与其在class中的声明顺序相同
- 为免除"跨编译单元的初始化次序"问题,请以local static对象替代non-local static对象
最新文章
- postgreSQL使用
- 【Go入门教程6】interface(interface类型、interface值、空interface{}、嵌入interface、反射)
- 10款让WEB前端开发人员更轻松的实用工具
- 2.SDK目录结构和adb工具及命令介绍
- Chrome开发工具Elements面板(编辑DOM和CSS样式)详解
- Day1(2016/1/21)——Beginning
- Unity3D脚本18:可视化辅助设置类 Gizmos
- JSBinding + SharpKit / 实战:转换 Survival Shooter
- logstash_agent.conf 语法注意事项
- 利用iOS API编写简单微博客户端全过程
- 首次push本地代码到github上出现的问题及解决方案
- sqlserver使用户只能在某个架构下建立表和存储过程
- arcgis jsapi 调用google地区服务
- vue集成百度UEditor富文本编辑器
- 简单模拟一下ab压力测试
- react+react-router+react-redux+nodejs+mongodb项目
- Python3.x在linux下print中文问题
- vue模式
- BSGS&;扩展BSGS
- git忽略某些文件的几种方法