《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 & ...
随机推荐
- nodejs中全栈开发框架meteor的文档
http://wiki.jikexueyuan.com/project/discover-meteor/routing.html, 这本书的源码地址: https://github.com/Dis ...
- 查看连接MYSQL数据库的IP信息
要统计数据库的连接数,我们通常情况下是统计总数,细分到每个ip地址: 方法一: ) as ip , count(*) from information_schema.processlist group ...
- spring boot 以jar的方式启动常用shell脚本
用spring boot框架做的项目,将第三方包全部打在jar里面,通过shell脚本启动和停止服务,常用的shell脚本模板如下: #!/bin/bashJAVA_OPTIONS_INITIAL=- ...
- C# TreeView,递归循环数据加载到treeView1中
TblAreaBLL bll = new TblAreaBLL(); private void button1_Click(object sender, EventArgs e) { LoadData ...
- python glob
http://python.jobbole.com/81552/ glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用 ...
- 【LeetCode】【动态规划】表格移动问题
前言 这里总结了两道表格移动的问题,分别是:Unique Paths 和 题一:Unique Paths 描述 A robot is located at the top-left corner of ...
- 06_Hadoop配置伪分布式模式详解
查看IP地址,设为手动模式: 配置hadoop用户sudo权限 su切换到root身份,配置vim /etc/sudoers文件,加入 hadoop ALL=(root)NOPASSWD:ALL ...
- 容器排序之sort,stable_sort
bool isShorter(const string &s1, const string &sz){ return s1.size() < sz.size(); } int m ...
- 【Tech】Mac上安装MAMP打开本地网页
不知道为什么实验室老是用些奇葩的东西,这次是madserve,主要是用来统计移动端广告点击率的,基于PHP/MYSQL实现. 昨天很快在Windows上搭好一个xampp,并用它建立了一个virtua ...
- POI 百万数据导出
poi 导出主类 package test; import java.io.File; import java.io.FileOutputStream; import java.lang.reflec ...