其实 无论学何种语言 ,还是觉得要养成先声明后使用,先初始化再使用。

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)...相关推荐

  1. 条款4:确定对象在使用前已被初始化

    考虑如下设计: 1 #include<iostream> 2 3 using namespace std; 4 5 class Entry 6 { 7 public: 8 Entry(co ...

  2. C++确定对象被使用前已先被初始化

    确定对象被使用前已先被初始化 读取未初始化对象的后果 按对象的类型划分 按对象的作用域与生命周期划分 读取未初始化对象的后果 读取未被初始化的值会导致不明确的行为.在某些平台上,仅仅只是读取未初始化的 ...

  3. 确定对象在使用前已经被初始化

    int nUserID; //这样的代码在VC6的DEBUG版本是初始化为0,RELEASE是未定义的数值. //之后有验证的VS10之后的版本DEBUG版本都是未定义的值. std::cout &l ...

  4. 中国疾控中心回应论文争议:所有病例在论文撰写前已向社会公布

    本文综合自人民网.科技部.知识分子.知乎网友Leorance 刚刚,国内多家权威媒体报道了中国疾病预防控制中心的官方回应. 内容如下-- 2020年1月29日,中国疾病预防控制中心.湖北省疾病预防控制 ...

  5. 特斯拉前员工承认备份AutoPilot代码,但入职小鹏汽车前已删除

    允中 发自 凹非寺  量子位 报道 | 公众号 QbitAI 特斯拉状告前华人员工一案,现在有了最新进展: 双方提交的法庭文件曝光了. 前特斯拉高级工程师曹光植(后入职小鹏汽车任感知主管)承认,在20 ...

  6. 四川地震发生前已有征兆?网民问责地震局未预警

    地震发生之后,"地震能否准确预报"迅速在网上引发极大争论,有的网民问罪地震局为什么没有提前预报,甚至比网友的反应速度还慢.但是,也有网友表示地震根本不能预报,但可以预警. 最先报地 ...

  7. js 对象数组中的已知对象的属性得到对象下标

    arr 对象数组, wyw已知属性 多用于接口返回数据后根据已知属性查其他属性 var arr = new Array({"name": "wxx", &quo ...

  8. {code:-1,error:`QcloudSecretId`不能为空,请确保 SDK 配置已正确初始化}解决方法

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 微信小程序云开发登录报错: {"code":-1,"error":&q ...

  9. C++中变量使用前一定要初始化

    在C++中变量声明后,在使用前一定要初始化. 1>如下代码: #include<iostream> using namespace std; int main(){for(int i ...

  10. Springboot项目启动前执行数据库初始化脚本

    背景:项目里面遇到了要在springboot项目启动前做数据库初始化的需求.总结一下几种方案: 1.使用flywaydb,启动工程的时候同时初始化脚本.集成倒是不难,主要是要解决bean的顺序加载问题 ...

最新文章

  1. 经验总结!我们是如何在编程面试中挂掉的
  2. 台式计算机怎么加一个硬盘,如何再安装一个台式计算机硬盘驱动器?如何在计算机安装中添加额外的硬盘...
  3. python(numpy,pandas8)——pandas大范围赋值和增加特定数据,处理丢失数据(nan)
  4. redis desktop manager连不上redis_Redis安装教程
  5. request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法
  6. iOS 应用程序的生命周期浅析
  7. 万圣节海报素材PSD分层模板
  8. 百度将砸钱100多亿元建云计算中心(2012-09-03)
  9. HDFS的架构和设计要点
  10. Linux下C编程入门
  11. mysql客户端汉化_【原创】Mysql客户端如何处理中文
  12. swf文件数据格式分析
  13. (绿色)修正版gooflow流程解决方案(源码分享+在线演示+UI地址下载)
  14. 计算机的平方根的符号是哪个,平方根
  15. services.msc 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动
  16. 计算机文件大小排序工具,如何对电脑文件夹进行排序
  17. linux生成license,License生成秘钥
  18. 华为鸿蒙内存机制,华为鸿蒙系统对内存有要求吗?
  19. 2023年最新批量删除微博_新版微博怎么批量删除自己发的微博?
  20. mysql存储过程之循环(WHILE,REPEAT和LOOP)

热门文章

  1. go - struct
  2. JVM学习03-常用Java虚拟机参数
  3. layui中全选反选_jQuery实现全选,反选,全不选
  4. mininet编程实现交换机规则的插入、删除与修改。_三层以太网交换机基本原理及转发流程...
  5. [渝粤教育] 长沙航空职业技术学院 信息技术 参考 资料
  6. caffe loss layer
  7. 软件类配置(六)【ubuntu16.04安装opencv3.4.1】
  8. grep常见操作整理(更新)
  9. 多维数组和矩阵----子数组最大累加和
  10. Leetcode513. Find Bottom Left Tree Value找树左下角的值