(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 读取未初始化的值会导致不确定的行为.在某些平台上,仅仅只是读取为初始化的值,就有可能让你的程序终止运行.更可能的情况是读入一些“半随机”bits,污染了正在进行读取的那个对象,最终导致不可测知的程序行为,以及令人不愉快的调试过程. 提出最佳准则:永远在使用对象之前将它初始化.分为两部分:对于无任何成员的内置类型,你必须手工完成此事:至于内置类型以外的其他任何东西…
条款4:确定对象被使用前已先被初始化 记住: ★为内置对象进行手工初始化,因为C++不保证初始他们 ★构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作.初始化列表列出的成员变量,其排列次序应和它们在class中的声明次序相同 ★为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象 -------------------------------------------------------------------------…
在确保对象在使用前已先被初始化这一条款的编码实践中,作者为我们总结了三条经验,它们分别是: ------------------------------------------------------------------------------------------------------- ⅰ. 手工初始化内置类型对象 ⅱ. 构造函数最好使用成员初值列,而不要在构造函数内使用赋值操作,其排列次序应和他们在类中声明的次序相同 ⅲ. 用local static对象替换non-local st…
Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure that objects are initialized before they're used.) 通常如果你使用 C part of C++ 而且初始化可能招致运行期成本,那么就不保证发生初始化.一旦进入 non-C part of C++, 规则有些变化.这就很好地解释了为什么 array (来自…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 编译器会在必要时候为我们的classes创建copying函数,这些“编译器生成版”的行为:将被烤对象的所有成员变量都做一份拷贝. 如果你声明自己的copying函数,意思就是告诉编译器你并不喜欢缺省实现中的某些行为.编译器仿佛被冒犯似的,会以一种奇怪的方式回敬:当你的实现代码几乎必然出错时却不告诉你.所以自己实现copying函数时,请遵循一条规则:如果你为c…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#define不被视为语言的一部分,那正是它的问题所在.#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本.#define的基本用法有两种,都容易出现问题,C++也分别采用不同的方法进行解决. 1. 简单的宏定义 1.1 核心…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) C++的各种能力和特性使它成为一个无可匹敌的工具,但也可能引发某些迷惑:所有“适当用法”似乎都有例外.我们该如何理解这种语言呢?最简单的办法就是将C++视为有相关语言组成的联邦而非单一语言.在它的某个次语言中,各种规则与通例都相对简单.然而从一个次语言移往另一个次语言,守则可能改变. C++主要的次语言有四个: 1 C 所到底C++以C为基础.区块.语句.预处理…
1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#deine缺点2 无法利用#define创建一个class专属常量,一旦宏被定义,它就在其后的编译过程中有效(除非遇到#undef). 改善:可以通过const成员变量来满足要求. 3.const成员变量缺点 占用存储空间 改善:通过enum代替 4.对于形似函数的宏,最好改用inline函数替换#defi…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为什么会出现自我赋值呢?不明显的自我赋值,是“别名”带来的结果:所谓“别名”就是“有一个以上的方法指涉对象”.一般而言如果某段代码操作pointers或references而它们被用来“指向多个相同类型的对象”,就需要考虑这些对象是否为同一个.实际上两个对象来自同一个继承体系,它们甚至不需要声明为相同类型就可能造成“别名”.因为一个base class的refe…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为方便采用书上的例子,先提出问题,在说解决方案. 1 问题 1: class Transaction{ 2: public: 3: Transaction(); 4: virtual void LogTransaction() const = 0 ; 5: ... 6: }; 7:  8: Transaction::Transaction() //Base cl…