条款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 注意区分赋值和初始化: 从初始化的角度而言, ...
随机推荐
- SpringBoot | 教程
Spring Boot 2.0(一):[重磅]Spring Boot 2.0权威发布 Spring Boot 2.0(二):Spring Boot 2.0尝鲜-动态 Banner Spring Boo ...
- Android课程设计第五天欢迎界面(滑动)和图形选择
注意:课程设计只为完成任务,不做细节描述~ 滑动界面 package com.example.myapplication; import android.content.Intent; import ...
- req.getParameter()无法获取参数(附前端json序列化)
问题:前端用Ajax的post方式想servlet传递参数,servlet的getParameter()方法无法获取参数. 前端代码: $.ajax({ url: '/TestWeb/addBook' ...
- CentOS6.5下安装Redis2.8.6和phpredis2.2.4扩展
一.版本说明 CentOS版本 [plain]view plaincopyprint? [root@localhost ~]# uname Linux [root@localhost ~]# unam ...
- php服务端接收post的json数据
最近用到ext与PHP交互,ext把json数据post给PHP,但在PHP里面$_post获取不到,$_REQUEST也获取不到,但是通过firedebug看到的请求信息确实是把JSON数据post ...
- Codeforces Round #243 (Div. 1)
---恢复内容开始--- A 枚举l,r #include <iostream> #include<cstdio> #include<cstring> #inclu ...
- RabbitMq+Haproxy负载均衡
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保 ...
- 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)
题意 满足$b_1 < b_2 < \dots < b_k$且$a_{b_1} \geqslant a_{b_2} \geqslant \dots \geqslant a_{b_k} ...
- RxJava的map方法与flatMap方法
简单讲,map和flatMap都是来完成Observable构造的数据到Observer接收数据的一个转换,这么说有点绕
- bt5r3安装postgresql
apt-get install postgresql