条款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内容。
条款4:确定对象被使用前已被初始化(Make sure that objects are initialized before they're used)的更多相关文章
- [effictive c++] 条款04 确定对象被使用前已被初始化
成员初始化 在c和c++ 中,使用为初始化的类型经常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个非常好的习惯. 永远在使用之前对对象进行初始化 ...
- Effective C++ 条款四 确定对象被使用前已被初始化
1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成. int x = 0; c ...
- Effective C++ -----条款04:确定对象被使用前已被初始化
为内置型对象进行手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同. 为免 ...
- EC读书笔记系列之2:条款4 确定对象被使用前已先被初始化
条款4:确定对象被使用前已先被初始化 记住: ★为内置对象进行手工初始化,因为C++不保证初始他们 ★构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作.初始化列表列出的成员变量,其排列次 ...
- NO.4: 确定对象被使用前已被初始化
1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始 ...
- [Effective C++ --009]确定对象被使用前已先被初始化
在确保对象在使用前已先被初始化这一条款的编码实践中,作者为我们总结了三条经验,它们分别是: ------------------------------------------------------ ...
- Effective C++ 之 Item 4:确定对象被使用前已先被初始化
Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure th ...
- Effective C++_笔记_条款04_确定对象被使用之前已先被初始化
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 读取未初始化的值会导致不确定的行为.在某些平台上,仅仅只是读取为 ...
- Effective C++(4) 确定对象被使用前已先被初始化
危害:读取未初始化的值会导致不明确甚至是半随机化的行为. 最佳处理办法:永远在使用对象之前先将它初始化:确保每一个构造函数都将对象的每一个成员初始化. 1 注意区分赋值和初始化: 从初始化的角度而言, ...
随机推荐
- 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...
- 跟我一起玩Win32开发(14):用对话框作为主窗口
前面我们在编写Win32应用程序的思路都是: 1.设计窗口类.2.注册窗口类.3.创建窗口.…… 然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编 ...
- 线段树(单点更新) POJ 2886 Who Gets the Most Candies?
题目传送门 #include <cstdio> #include <cstring> #define lson l, m, rt << 1 #define rson ...
- 模拟 百度之星资格赛 1003 IP聚合
题目传送门 /* 模拟水题,排序后找出重复的ip就可以了 */ #include <cstdio> #include <iostream> #include <algor ...
- Joystick
Joystick相当于5个按键的集合,向上.下.左.右.中间5个方向接通,经常用于游戏场合.
- arttemplate模板引擎有假数据返回数据多层内嵌的渲染方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 解决Ueditor在bootstarp 模态框中全屏问题
基本的一些配置就不说了.先说一下要注意的问题:首先是zIndex的设置.记住最好都显示设置模态框和ueditor的zIndex.理清他们的层叠关系. 特别是用到ueditor里面的图片上传功能的更要设 ...
- 数据源引用 java:/comp/env
编辑 删除 数据源引用 java:/comp/env 2012-01-28 15:59 ENC的概念: The application component environment is ref ...
- 洛谷 P1832 A+B Problem(再升级)
题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛滥趋势 ·以上纯属个人吐槽 ·给定一个正整数n ...
- Window.Event.KeyCode的含义
Window.Event.KeyCode=13的含义(转载) 2011-04-16 09:41:18| 分类: html | 标签:keycode event realkey var do ...