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

《Effective C++》——条款04:确定对象使用前已先被初始化

  读取未初始化的值会导致不明确的行为。在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行。更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序行为,以及许多令人不愉快的调试过程。

  • 对于内置类型的对象手动初始化
  • 对于内置类型以外的任何其他东西,初始化责任落在构造函数身上。

   但要区别赋值和初始化。对象的成员变量的初始化动作发生在进入构造函数本体之前。

 在上述代码中,theName,theAddress和thephones都不是被初始化,而是被赋值。初始化的发生时间更早,发生于这些成员的默认构造函数被自动调用时(比进入ABEntry构造函数本体的时间更早)。但这对numTimesConsulted不为真,因为它属于内置类型,不保证一定在你所看到的那个赋值动作的时间点之前获得初值。

ABEntry构造函数的一个较佳写法是,使用初始化成员列表替换赋值动作:

这个构造函数效率更高。基于赋值的那个版本首先调用默认构造函数为theName,theAddress和thePhones设初值,然后立刻再对它们赋予新值。默认构造函数的一切作为就因此浪费了。成员初始化列表避免了这一问题。因为初始化列表中针对各个成员变量而设的实参,被拿去作为各成员变量之构造函数的实参。本例中的theName以name为初值进行copy构造,theAddress以address为初值进行copy构造,thePhones以phones为初值进行copy构造。

  对大多数类型而言,比起先调用默认构造函数然后再调用copy assignment操作符,单只调用一次copy构造函数时比较高效的。对于内置型对象,其初始化和赋值的成本相同,但为了一致性最好也通过成员初始化列表来实现。

 

“不同编译单元内定义之non-local static对象”的初始化次序

函数内的static对象称为local static对象(对函数而言是local),其他static对象称为non-loca static对象。程序结束时static对象会被自动销毁。

编译单元是指产出单一目标文件的那些源码。基本上它是单一源码加上其所含入的头文件(#include files)。

现在,我们关心的问题涉及至少两个源码文件,每一个内含至少一个non-local static对象(即该对象是global 或位于namespace作用域内,抑或在class内或file作用域内被声明为static)。真正的问题是:如果某编译单元内的某个non-local static对象的初始化动作使用了另一编译单元内的某个non-local static对象,它所用到的这个对象可能尚未被初始化,因为C++对“定义于不同编译单元内的non-local static对象”的初始化次序并无明确定义。

转载于:https://www.cnblogs.com/happygirl-zjj/p/4638120.html

相关文章:

  • Treemap的使用
  • 数组根据index拆分和查询下标
  • include指令和include动作的区别
  • sql-主键即自增长的设置及语法实现
  • android中的样式主题和国际化
  • sql-go的使用
  • sql 获取新插入的id值的三种方法
  • 关于WCF SessionId的说明
  • idea中的jsp依赖
  • html5页面中拨打电话的方式
  • Cron表达式
  • 参数修饰符ref,out,params的区别
  • filter的简单介绍
  • 【转】深入理解java异常处理机制
  • 永久激活(破解) IntelliJ IDEA 2018(2018年10月更新)
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【译】理解JavaScript:new 关键字
  • 3.7、@ResponseBody 和 @RestController
  • in typeof instanceof ===这些运算符有什么作用
  • Mysql数据库的条件查询语句
  • Python中eval与exec的使用及区别
  • scala基础语法(二)
  • spring boot 整合mybatis 无法输出sql的问题
  • Swift 中的尾递归和蹦床
  • Vim 折腾记
  • Vue2.x学习三:事件处理生命周期钩子
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 工作手记之html2canvas使用概述
  • 关于使用markdown的方法(引自CSDN教程)
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 强力优化Rancher k8s中国区的使用体验
  • hi-nginx-1.3.4编译安装
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #pragma once
  • #考研#计算机文化知识1(局域网及网络互联)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (笔试题)合法字符串
  • (多级缓存)多级缓存
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core 2.1路线图
  • .net 无限分类
  • @RestController注解的使用
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [ 蓝桥杯Web真题 ]-布局切换
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [android] 天气app布局练习
  • [bzoj 3534][Sdoi2014] 重建
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】