effective c++学习笔记

1、c++的组成

c、c++的面向对象部分、模板、STL。

2、尽量以const,enum,inline替换#define

define的缺点:

1)以define定义常量时,常量名对于编译器来说是不可见的。因为常量已经被预处理器处理了,常量名根本不进入symbol table。如果这个常量出现异常,则编译器会提到常量的数字,而不会提到常量名,这样会因为调试而浪费时间。

2)define没有作用域的概念。无法在类中利用define构建一个专属或私有常量。

3)用define定义宏,形式复杂易出错。

对于以上情况:
1)对于单纯的常量,最好以const对象或enum替换#define

2)对于形似函数的宏,最好以inline替换#define

3、确定对象被使用前被初始化

最佳处理办法:

1)对于无任何成员的内置类型,必须手工完成初始化。

2)至于内置类型以外的任何其他东西,初始化使用构造函数。使用成员初值列的方式构造通常效率最高,因为可以避免成员变量调用自身的构造函数。

3)对于static对象的非本地调用,会出现“跨编译单元的初始化次序问题”(其他模块调用了本模块的static对象,但可能此对象并未构造。出现这种情况的原因在于c++并不定义初始化次序)。

解决这个问题的方法就是在类中声明一个static函数,然后在其中定义那个static对象,并返回其引用。利用这种方法,可保证static对象在每次使用时都经过了初始化。

4、c++自动生成的函数

默认的,一个empty class经过c++处理后,编译器会为它声明一个拷贝构造函数,一个等号重载操作函数,一个析构函数(非虚),一个默认的构造函数。这些函数都是public且inline的。

默认构造函数:如果在类中已经自定义了一个构造函数,则编译器不自动生成此默认构造函数。

拷贝构造函数:编译器创建的版本只是单纯的将来源对象的每一个非静态成员变量拷贝到目标对象。

5、若不想使用编译器自动生成的函数,就应该明确的拒绝

假设我们不希望class支持一些特定的功能,那么我们只要不声明对应的函数即可。可是这种方法对于拷贝构造函数和重载等号操作符不起作用,因为如果你不声明,则编译器会自动生成,并且为public。

遇到以上的情况,最稳妥的做法是,将拷贝构造函数和重载等号操作符声明为private,并且不实现它们,仅仅是声明。这样客户在调用的时候编译器会给予相应的ERROR。

6、为多态类声明virtual析构函数

你可能感兴趣的:(C++,c,table,Class,编译器)