《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对象”的初始化次序并无明确定义。
《Effective C++》——条款04:确定对象使用前已先被初始化的更多相关文章
- 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化
永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ...
- Effective C++ -----条款04:确定对象被使用前已被初始化
为内置型对象进行手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同. 为免 ...
- [Effective C++ --009]确定对象被使用前已先被初始化
在确保对象在使用前已先被初始化这一条款的编码实践中,作者为我们总结了三条经验,它们分别是: ------------------------------------------------------ ...
- Effective C++ 之 Item 4:确定对象被使用前已先被初始化
Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure th ...
- EC读书笔记系列之2:条款4 确定对象被使用前已先被初始化
条款4:确定对象被使用前已先被初始化 记住: ★为内置对象进行手工初始化,因为C++不保证初始他们 ★构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作.初始化列表列出的成员变量,其排列次 ...
- [effictive c++] 条款04 确定对象被使用前已被初始化
成员初始化 在c和c++ 中,使用为初始化的类型经常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个非常好的习惯. 永远在使用之前对对象进行初始化 ...
- Effective C++(4) 确定对象被使用前已先被初始化
危害:读取未初始化的值会导致不明确甚至是半随机化的行为. 最佳处理办法:永远在使用对象之前先将它初始化:确保每一个构造函数都将对象的每一个成员初始化. 1 注意区分赋值和初始化: 从初始化的角度而言, ...
- Effective C++学习笔记 条款04:确定对象被使用前已先被初始化
一.为内置类型对象进行手工初始化,因为C++不保证初始化它们. 二.对象初始化数据成员是在进入构造函数用户编写代码前完成,要想对数据成员指定初始化值,那就必须使用初始化列表. class A { pu ...
- Effective C++ 条款04:确定对象被使用前已经先被初始化
规则一 永远在使用对象之前将它初始化 int x = 0; const char* text = "A C-style string"; double d; std:: cin & ...
随机推荐
- .net全部版本的官方下载地址
https://technet.microsoft.com/zh-cn/5a4x27ek
- 于win2008R2虽然激活,但是一个小时之后就会自动强制关机的问题
写一个批处理文件: taskkill /f /im wlms.exeping -n 4 127.0.0.1shutdown -a 用记事本写下以上的命令,另存为.bat 批处理文件.双击运行,即可. ...
- Python基础-os和sys模块
os模块提供对操作系统进行调用的接口 import os os.getcwd() # 获取当前工作目录 os.chdir(r'd:\fansik') # 修改对当前工作目录 print(os.curd ...
- 随心所欲移动Panel
C# Winform编程时,有时需要在程序执行时,使窗体中的panel控件可以随意的移动,这时可以采用下面这种方法: 主要包括以下两步: @1:给panel(此处以 RealGLPanel为例说明)添 ...
- Charles安装与使用
Charles是在 Mac 下常用的网络封包截取工具,在做 移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析. Charles 通过将自己设置成系统的网络访问代理服务器,使 ...
- ruby rails 安裝
安装之前先更换Ubuntu的源 https://www.cnblogs.com/znsongshu/p/9452067.html http://gems.ruby-china.org/ 一/安 ...
- 留言处插入xss不弹框
对于新手来说,往往会在留言地方插入<script>alert(1)</script>来检测是否有存储xss,事实是基本上不会弹框的,为啥? 通过查看源码,可知道<> ...
- 前端 JavaScript&Dom
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...
- 面向服务体系架构(SOA)和数据仓库(DW)的思考
摘要: 当前业界对面向服务体系架构(SOA)和数据仓库(Data Warehouse,DW)都介绍的很多,提出了很多优秀的解决方案,但是一般是把 SOA 和 DW 单独考虑,SOA 和 DW 有着共同 ...
- iOS 根据农历日期 获取当前的农历年份 即 干支纪年法算农历年
前言:我国古代是用干支纪年的,近代史上提到的甲午战争.戊戌变法.辛亥革命等名词就是干支纪年.所谓干支就是十天干和十二地支的简称.天干.地支按照一定规则(单配单,双配双)可以搭配成60对,也就是一个甲子 ...