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

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)的更多相关文章

  1. [effictive c++] 条款04 确定对象被使用前已被初始化

    成员初始化 在c和c++ 中,使用为初始化的类型经常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个非常好的习惯. 永远在使用之前对对象进行初始化 ...

  2. Effective C++ 条款四 确定对象被使用前已被初始化

    1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成.      int x = 0;      c ...

  3. Effective C++ -----条款04:确定对象被使用前已被初始化

    为内置型对象进行手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同. 为免 ...

  4. EC读书笔记系列之2:条款4 确定对象被使用前已先被初始化

    条款4:确定对象被使用前已先被初始化 记住: ★为内置对象进行手工初始化,因为C++不保证初始他们 ★构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作.初始化列表列出的成员变量,其排列次 ...

  5. NO.4: 确定对象被使用前已被初始化

    1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始 ...

  6. [Effective C++ --009]确定对象被使用前已先被初始化

    在确保对象在使用前已先被初始化这一条款的编码实践中,作者为我们总结了三条经验,它们分别是: ------------------------------------------------------ ...

  7. Effective C++ 之 Item 4:确定对象被使用前已先被初始化

    Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure th ...

  8. Effective C++_笔记_条款04_确定对象被使用之前已先被初始化

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 读取未初始化的值会导致不确定的行为.在某些平台上,仅仅只是读取为 ...

  9. Effective C++(4) 确定对象被使用前已先被初始化

    危害:读取未初始化的值会导致不明确甚至是半随机化的行为. 最佳处理办法:永远在使用对象之前先将它初始化:确保每一个构造函数都将对象的每一个成员初始化. 1 注意区分赋值和初始化: 从初始化的角度而言, ...

随机推荐

  1. 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)

    传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...

  2. 跟我一起玩Win32开发(14):用对话框作为主窗口

    前面我们在编写Win32应用程序的思路都是: 1.设计窗口类.2.注册窗口类.3.创建窗口.…… 然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编 ...

  3. 线段树(单点更新) POJ 2886 Who Gets the Most Candies?

    题目传送门 #include <cstdio> #include <cstring> #define lson l, m, rt << 1 #define rson ...

  4. 模拟 百度之星资格赛 1003 IP聚合

    题目传送门 /* 模拟水题,排序后找出重复的ip就可以了 */ #include <cstdio> #include <iostream> #include <algor ...

  5. Joystick

    Joystick相当于5个按键的集合,向上.下.左.右.中间5个方向接通,经常用于游戏场合.

  6. arttemplate模板引擎有假数据返回数据多层内嵌的渲染方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 解决Ueditor在bootstarp 模态框中全屏问题

    基本的一些配置就不说了.先说一下要注意的问题:首先是zIndex的设置.记住最好都显示设置模态框和ueditor的zIndex.理清他们的层叠关系. 特别是用到ueditor里面的图片上传功能的更要设 ...

  8. 数据源引用 java:/comp/env

      编辑 删除 数据源引用 java:/comp/env 2012-01-28 15:59   ENC的概念: The application component environment is ref ...

  9. 洛谷 P1832 A+B Problem(再升级)

    题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛滥趋势 ·以上纯属个人吐槽 ·给定一个正整数n ...

  10. Window.Event.KeyCode的含义

    Window.Event.KeyCode=13的含义(转载) 2011-04-16 09:41:18|  分类: html |  标签:keycode  event  realkey  var  do ...