条款4:确定对象被使用前已被初始化(Make sure that objects are initialized before they're used)...
其实 无论学何种语言 ,还是觉得要养成先声明后使用,先初始化再使用。
1.永远在使用对象之前先将其初始化。
内置类型: 必须手工完成。
内置类型以外的:使用构造函数完成。确保每一个构造函数都将对象的一个成员初始化。
shit!!读到这,以前一直以为有些概念独自觉悟到的,大牛们也有这样的想法!!!!
2.区分开assignment & initialization(这个需要再看看,似乎以前的认知是错误的!!!!)
initializatin:在default构造函数时才是对非内置类型做初始化。
assignment: 非default构造函数只是对成员变量赋值操作。
一定要把user-defined types 成员变量列在“成员初值列表“中。为了记忆,内置类型也要放入初值列中。
3.成员初始化次序
base classes ==> derived classes ==>class 的成员变量以声明次序被初始化。
4.non-local static 对象:
static对象的生命周期,自创造开始直至程序结束。
local static 对象是指:作用域在函数内的static object。非函数的作用域对象都是non-local static 对象,比如:file/global/namespace/classs...内的static对象。
编译单元(translation unit):就是单一源码文件+#include files(即头文件)
对于定义在不同编译单元内的non-local static 对象 的初始化次序并无明确定义 《====这个问题需要克服解决,于是有了已经下技术。
本质是使用local static object 替代 non -local static object
就是把non-local static object 放到function中,由调用函数(返回一个reference 指向local static object)代替直接使用non-local static object。
其实,自己在函数内部初始化了这个local static object。而且如果实际没有用到这个对象,也自然不会引起构造、析构成本。
eg:
class FileSystem{......};
FileSystem& tfs()
{
static FileSystem fs;
return fs;
}
class Directory{.....};
Directory::Directory(params)
{
....
std::size_t disks = tfs().numDisks();
....
}
Directory& tempDir()
{
static Directroy td;
return td;
}
为了对象初始化前使用它,要做到:
1.手工初始化内置型non-member对象。
2.使用成员初始值列(member initialization lists)初始化对象的所有成分。
3.若”初始化次序不确定性“,把non-local static object 利用函数 化为 local static object
以上三点也是NOTE内容。
转载于:https://www.cnblogs.com/chip/p/4764762.html
条款4:确定对象被使用前已被初始化(Make sure that objects are initialized before they're used)...相关推荐
- 条款4:确定对象在使用前已被初始化
考虑如下设计: 1 #include<iostream> 2 3 using namespace std; 4 5 class Entry 6 { 7 public: 8 Entry(co ...
- C++确定对象被使用前已先被初始化
确定对象被使用前已先被初始化 读取未初始化对象的后果 按对象的类型划分 按对象的作用域与生命周期划分 读取未初始化对象的后果 读取未被初始化的值会导致不明确的行为.在某些平台上,仅仅只是读取未初始化的 ...
- 确定对象在使用前已经被初始化
int nUserID; //这样的代码在VC6的DEBUG版本是初始化为0,RELEASE是未定义的数值. //之后有验证的VS10之后的版本DEBUG版本都是未定义的值. std::cout &l ...
- 中国疾控中心回应论文争议:所有病例在论文撰写前已向社会公布
本文综合自人民网.科技部.知识分子.知乎网友Leorance 刚刚,国内多家权威媒体报道了中国疾病预防控制中心的官方回应. 内容如下-- 2020年1月29日,中国疾病预防控制中心.湖北省疾病预防控制 ...
- 特斯拉前员工承认备份AutoPilot代码,但入职小鹏汽车前已删除
允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 特斯拉状告前华人员工一案,现在有了最新进展: 双方提交的法庭文件曝光了. 前特斯拉高级工程师曹光植(后入职小鹏汽车任感知主管)承认,在20 ...
- 四川地震发生前已有征兆?网民问责地震局未预警
地震发生之后,"地震能否准确预报"迅速在网上引发极大争论,有的网民问罪地震局为什么没有提前预报,甚至比网友的反应速度还慢.但是,也有网友表示地震根本不能预报,但可以预警. 最先报地 ...
- js 对象数组中的已知对象的属性得到对象下标
arr 对象数组, wyw已知属性 多用于接口返回数据后根据已知属性查其他属性 var arr = new Array({"name": "wxx", &quo ...
- {code:-1,error:`QcloudSecretId`不能为空,请确保 SDK 配置已正确初始化}解决方法
微信小程序开发交流qq群 173683895 承接微信小程序开发.扫码加微信. 微信小程序云开发登录报错: {"code":-1,"error":&q ...
- C++中变量使用前一定要初始化
在C++中变量声明后,在使用前一定要初始化. 1>如下代码: #include<iostream> using namespace std; int main(){for(int i ...
- Springboot项目启动前执行数据库初始化脚本
背景:项目里面遇到了要在springboot项目启动前做数据库初始化的需求.总结一下几种方案: 1.使用flywaydb,启动工程的时候同时初始化脚本.集成倒是不难,主要是要解决bean的顺序加载问题 ...
最新文章
- 经验总结!我们是如何在编程面试中挂掉的
- 台式计算机怎么加一个硬盘,如何再安装一个台式计算机硬盘驱动器?如何在计算机安装中添加额外的硬盘...
- python(numpy,pandas8)——pandas大范围赋值和增加特定数据,处理丢失数据(nan)
- redis desktop manager连不上redis_Redis安装教程
- request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法
- iOS 应用程序的生命周期浅析
- 万圣节海报素材PSD分层模板
- 百度将砸钱100多亿元建云计算中心(2012-09-03)
- HDFS的架构和设计要点
- Linux下C编程入门
- mysql客户端汉化_【原创】Mysql客户端如何处理中文
- swf文件数据格式分析
- (绿色)修正版gooflow流程解决方案(源码分享+在线演示+UI地址下载)
- 计算机的平方根的符号是哪个,平方根
- services.msc 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动
- 计算机文件大小排序工具,如何对电脑文件夹进行排序
- linux生成license,License生成秘钥
- 华为鸿蒙内存机制,华为鸿蒙系统对内存有要求吗?
- 2023年最新批量删除微博_新版微博怎么批量删除自己发的微博?
- mysql存储过程之循环(WHILE,REPEAT和LOOP)
热门文章
- go - struct
- JVM学习03-常用Java虚拟机参数
- layui中全选反选_jQuery实现全选,反选,全不选
- mininet编程实现交换机规则的插入、删除与修改。_三层以太网交换机基本原理及转发流程...
- [渝粤教育] 长沙航空职业技术学院 信息技术 参考 资料
- caffe loss layer
- 软件类配置(六)【ubuntu16.04安装opencv3.4.1】
- grep常见操作整理(更新)
- 多维数组和矩阵----子数组最大累加和
- Leetcode513. Find Bottom Left Tree Value找树左下角的值