条款4:确定对象在被使用前已经被初始化

需要注意三点:

1.手工初始化内置型的非成员对象

2.使用初始化成员列表对付对象的所有成员

3.对"初始化顺序不确实"的问题要注意自己的设计.

这里重点介绍下第三种的情况:

下面的tfs会在外部文件b.cpp中使用,但是当前这种写法不能够保证tfs在b.cpp中使用时已经被初始化了,这样就会造成问题.

 1 //a.h
 2 class FileSystem
 3 {
 4 public:
 5     int numDisk() const;
 6 };
 7
 8 extern FileSystem fs;    //只是声明
 9
10 //a.cpp
11 FileSystem fs;    //这里是定义
12
13
14 ///b.cpp
15 class Directory
16 {
17 public:
18     Directory(string params)
19     {
20         int disks = fs.numDisks();    //因为a.cpp和b.cpp在编译时并不能保证先后顺序,有可能出现tfs还没有被初始化,就被使用的情况
21     }
22 };

把tfs声明为一个函数,返回对象的引用,这样b.cpp中去调用时,就能够保证fs一定是初始化了的.不过这里我有个疑问,作者为什么要用静态变量的引用呢?不可以是局部变量吗?或者不使用引用吗?

 1 //a.h
 2 class FileSystem    //库中定义的类
 3 {
 4 public:
 5     int numDisks() const;
 6 };
 7
 8 //a.cpp
 9 FileSystem &tfs()//这样写,表示tfs()是一个全局函数,而非成员函数.
10 {
11     static FileSystem fs;    //C++保证函数中的local static对象会在"该函数被调用期间""首次遇上该对象的定义式"时被初始化.
12     return fs;
13 }
14
15 //b.cpp
16 class Directory
17 {
18 public:
19     Directory(string params)
20     {
21         int  disks = tfs().numDisks();
22     }
23 };

原文地址:https://www.cnblogs.com/Stephen-Qin/p/12081549.html

时间: 2024-11-06 14:57:00

条款4:确定对象在被使用前已经被初始化的相关文章

条款4:确定对象被使用前已被初始化(Make sure that objects are initialized before they're used)

其实 无论学何种语言 ,还是觉得要养成先声明后使用,先初始化再使用. 1.永远在使用对象之前先将其初始化. 内置类型: 必须手工完成. 内置类型以外的:使用构造函数完成.确保每一个构造函数都将对象的一个成员初始化. shit!!读到这,以前一直以为有些概念独自觉悟到的,大牛们也有这样的想法!!!! 2.区分开assignment & initialization(这个需要再看看,似乎以前的认知是错误的!!!!) initializatin:在default构造函数时才是对非内置类型做初始化. a

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

1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成.      int x = 0;      const int * p = &x; 3.不要混淆赋值与初始化的区别.一般初始化在定义的时候一起进行.而赋值是在定义之后的动作.      比如说在某一个类中的构造函数中,函数的行为都是赋值操作,而非初始化操作.      一般来说,对象的成员变量的初始化动作发生在进入构造函数本体之前.所以,我们一

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

成员初始化 在c和c++ 中,使用为初始化的类型常常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个很好的习惯. 永远在使用之前对对象进行初始化.对于无任何成员的内置类型,你必须手工完成初始化操作.因为c++不保证初始化他们. 内置类型意外的其他东西,初始化责任落在构造函数身上.但要注意区分构造函数中的变量是赋值还是初始化.举个例子 class PhoneNumber{...}; class ABEntry{ public: ABEntry(

条款04:确定对象使用前已被初始化

目录 1. 总结 2. 构造函数体 VS 初始化列表 3. 对象的初始化顺序问题 1. 总结 无论是在初始化列表中,还是在构造函数体内,请为内置类型对象进行手工初始化,因为C++不保证初始化它们 最好使用初始化列表进行初始化,而不要在构造函数体中使用赋值:初始化列表最好列出所有的成员变量,其排列顺序应该和它们在class中的声明顺序相同 为了避免"不同源文件内定义的non-local static对象在编译时的初始化顺序"问题,请以local static对象替换non-local s

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

1. 对于内置类型,如果变量在全局作用域内定义,默认初始化为0,如果变量在局部作用域内定义,默认不进行初始化; 对于类类型,默认调用默认构造函数进行初始化,如果没有默认构造函数,则必须显式初始化. 2. 构造函数对成员进行初始化的动作发生在初始化列表中而不是函数体内,在函数体内进行的"初始化"实际上是赋值,对于类类型,降低了程序效率,对于内置类型在初始化列表还是在函数体内初始化对于效率没有影响,但在某些特殊情况(例如const变量和引用)必须在初始化列表进行初始化. 3. 类类型的构造

条款4:确定对象被使用前已被初始化

一. 永远在使用对象之前将它初始化 1.对于内置类型,手动完成初始化. 例如:int =0; 2.除了内置类型之外的类型,由构造函数进行初始化:确保每个构造函数都将对象的每一个成员进行了初始化. 二. 特别区分"赋值"和"初始化" 例如:有一个类:A中有一个成员变量string  name; 有一个构造函数:A(const string &n){name=n;}//这是赋值操作而非初始化,这里调用了默认构造函数和赋值运算符 A(const string &a

Effective C++_笔记_条款12_复制对象时勿忘其每一个成分

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 编译器会在必要时候为我们的classes创建copying函数,这些“编译器生成版”的行为:将被烤对象的所有成员变量都做一份拷贝. 如果你声明自己的copying函数,意思就是告诉编译器你并不喜欢缺省实现中的某些行为.编译器仿佛被冒犯似的,会以一种奇怪的方式回敬:当你的实现代码几乎必然出错时却不告诉你.所以自己实现copying函数时,请遵循一条规则:如果你为c

effective c++ 条款 04 (对象初始化)整理

确定对象使用前已被初始化 原则:不论是类的成员变量还是其他作用域的变量,使用前都要保证已被初始化(或者说赋值) 一.无任何成员的内置类型初始化 /*内置类型通过复制完成初始化*/ int x = 0; const char* a = "abc"; int a[2] = {0,0}; 二.STL容器初始化 STL容器关注容器大小,防止越界,初始化的工作不用关心 三.类成员变量初始化 参考:http://www.cnblogs.com/BlueTzar/articles/1223169.h

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅