`
kanwoerzi
  • 浏览: 1643212 次
文章分类
社区版块
存档分类
最新评论

Effective c++ 学习笔记——条款04:确定对象被使用前已先被初始化

 
阅读更多

Make sure that objects are initialized before they're used.

昨天就已经把第四条款看完了,初始化这篇内容非常非常丰富,讲解了很多,也让我的一些疑惑解开了。由于经常加班,写作时间比较少,我今天看写完这篇文章,还要看下一条目,所以,我今天不能逐句的进行了解析,只能我觉得我认为比较重要的几点点出来。也希望大家给点指正。

变量的初始化

关于"将对象初始化"这事,C++ 似乎反复无常。如果你这么写:

int i;

他会输出什么呢?给大家一段代码


大家看到了吧,打印的是这种东西,所以,你一定要记住,对变量一定要初始化,当你忘记初始化然后又使用了它,就会有意想不到的灾难产生。

构造函数初始化

对于内置类型以外的其它对象,通常初始化责任落在构造函数身上。规则很简单:确保每一个构造函数都将对象的每一个成员初始化。但是必须清楚一个概念,就是赋值并非初始化。看下面的代码,假设有类型Person,它的构造函数所做的事情是赋值。虽然Person对象做到了你所期望的结果,但这不是C++中的最佳做法。


初始化列表的性能要高于赋值操作,因为对于string类型的name,它必须先调用string的default构造函数,然后再赋予新的值(copy assignment),这样default构造函数所做的事情全部浪费。不过对于内放类型来说,赋值与初始化列表的性能差异几乎没有。

所以,构造函数初始化最好用以下方式进行:


这样就很高效率了。

许多classes拥有多个构造函数,每个构造函数有自己的成员初值列。如果这种classes存在许多成员变量和/或base classes,多份成员初值列的存在就会导致不受欢迎的重复(在初值列内)和无聊的工作(对程序员而言)。这种情况下可以合理地在初值列中遗漏那些"赋值表现像初始化一样好"的成员变量,改用它们的赋值操作,并将那些赋值操作移往某个函数(通常是private),供所有构造函数调用。这种做法在"成员变量的初值系由文件或数据库读入"时特别有用。然而,比起经由赋值操作完成的"伪初始化"(pseudo-initialization),通过成员初值列(member initialization list)完成的"真正初始化"通常更加可取。还有重要的一点就是:如果成员变量是const或者refrences,他们就一定需要初值,不能被赋值。


必需要提到的是初始化列表的初始顺序不是根据在构造函数中写的顺序初始化,而是根据成员变量的声明顺序进行构造如下程序编译是不成功的

Singleton——单例模式

所谓static对象,其寿命从被构造出来直到程序结束为止,因此stack和heap-based对象都被排除。这种对象包括global对象、定义于namespace作用域内的对象、在classes内、在函数内、以及在file作用域内被声明为static的对象。函数内的static对象称为local static对象(因为它们对函数而言是local),其他static对象称为non-local static对象。程序结束时static对象会被自动销毁,也就是它们的析构函数会在main()结束时被自动调用。

假设出现就是static变量,这些static变量分别定义在不同的文件内。最后编译器怎么来根据优先顺序编译呢。而如果出现某个变量的初始化依赖与另一个文件内的变量。为了解决这样的问题,最简单的方式就是使用Singleton(单例模式),使non-local static成为local static

如下代码实现了单例模式:


但是从另一个角度看,这些函数"内含static对象"的事实使它们在多线程系统中带有不确定性。再说一次,任何一种non-const static 对象,不论它是local或non-local,在多线程环境下"等待某事发生"都会有麻烦。处理这个麻烦的一种做法是:在程序的单线程启动阶段(single-threaded startup portion)手工调用所有reference-returning函数,这可消除与初始化有关的"竞速形势(race conditions)"。

请记住

  • 为内置型对象进行手工初始化,因为C++不保证初始化它们。
  • 构造函数最好使用成员初值列(member initialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
  • 为免除"跨编译单元之初始化次序"问题,请以local static对象替换non-local static对象。


分享到:
评论

相关推荐

    Effective C++ 中文版

    条款04:确定对象被使用前已先被初始化 2.构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 条款06:若不想使用编译器自动成生的函数,就该明确拒绝 条款07:为多态基类声明Virtual析构函数 条款08:...

    Effective Modern C++学习笔记

    《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...

    C++学习书籍——effective c++ 3rd(中英文)

    C++学习书籍——effective c++ 3rd(中英文)

    Effective C++学习笔记

    Effective C++学习笔记 没有时间看Effictive C++书的人可以看看这个笔记 总结出了重点啊 适合有c++基础的人阅读

    effective c++读书笔记

    effective c++读书笔记和总结 effective c++读书笔记和总结

    Effective C++

    Effective C++(编程的50个细节) Effective C++(编程的50个细节)着重讲解了编写C++程序应该注意的50个...条款47:确保非局部静态对象在使用前被初始化 条款48:重视编译器警告 条款49:熟悉标准库 条款50:提高对C++的认识

    Effective C++学习笔记.doc

    自己整理的侯捷版本<<Effective C++ 改善程序与设计的55个具体做法>> 学习笔记.

    Effective.C++.中文第二版.50条款doc文档.chm

    Effective.C++.中文第二版,大小 1 Mb,chm 格式,作者:Scott Meyers,翻译:Lostmouse。...条款47: 确保非局部静态对象在使用前被初始化 条款48: 重视编译器警告 条款49: 熟悉标准库 条款50: 提高对C++的认识

    Effective Modern C++:改善C++11和C++14的42个具体做法(中文版 + 英文版)

    《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和...

    effective C++读书笔记

    effective C++读书笔记,effective C++读书笔记,effective C++读书笔记

    Effective C++(第三版)

    条款04:确定对象被使用前已先被初始化 make sure that objects are initialized before they're used. 2. 构造/析构/赋值运算 constructors, destructors, and assignment operators 条款05:了解c++ 默默编写并...

    effective C++ 读书笔记

    effective C++ 很好 很不错 最好的C++进阶资料

    Effective C++跟more Effective c++

    Effective C++跟more Effective c++

    More Effective C++

    和其前一本兄弟书籍 Effective C++一样,More Effective C++对每一位以C++为开发工具的程序员而言,都必备读物。  继 Effective C++ 之後,Scott Meyers 於 1996 推出这本「续集」。条款变得比较少,页数倒是多了...

    effective C++ 读书笔记 PPT

    摘录了《Effective C++》 (Scott Meyers 著)中有参考价值的编写代码建议,方面阅读

    Effective_Modern_C++_中文版

    它描述的正是使用C++11和C++14——现代C++来撰写真正卓越的软件之道。 涵盖以下主题: 大括号初始化、noexcept规格、完美转发,以及智能指针的make函数的优缺点 std::move、std::forward、右值引用和万能引用之间...

    Effective C++(中文版).pdf

    Effective C++是世界顶级C++大师Scott Meyers的成名之作,初版于1991年。在国际上,这本书所引起的反响之大,波及整个计算机技术出版领域,余音至今未绝。几乎在所有C++书籍的推荐名单上,这部专著都会位于前三名。...

    Effective C++第三版及详细笔记

    内容简介:有人说C++程序员可以分为两类,读过Effective C++的和没读过的。当您读过《Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》之后,就获得了迅速提升自己C++功力的一个契机。

    effective c++和more effective c++

    电子版的effective c++ 和more effective c++ c++四书五经中介绍的经典书籍

Global site tag (gtag.js) - Google Analytics