这是《C++大学教程》第2版的一些记录。第二版显得比较旧,具体时间我没有查到,从其中的内容看来应该是C++标准推出之前。
1. C++中获取随机数
srand函数只要在程序中调用一次即可得到所需要的随机化结果,多次调用是多余的,会降低程序性能。
由rand函数直接产生的值总是取值为:
0<<rand()<<RAND_MAX
常见错误:
用srand函数代替rand函数产生随机数是个语法错误,因为srand函数不返回值。
2. C++中的存储类
C++提供了4个存储类说明符:auto,register,extern和static。标识符的存储类说明符可以确定其存储、范围和连接。
标识符的存储类确定了标识符在内存中存在的时间。有些标识符的存在时间很短,有些则重复生成和删除,有些存在于整个程序的执行期间。
标识符的作用域是程序中能引用这个标识符的区域。有些标识符可以在整个程序中引用,而有些标识符只能在程序中的有限部分引用。
标识符的连接确定多源文件程序中,只有当前源文件或是在任何正确声明的源文件中识别标识符。
3. 为了获得程序的清晰性和高性能,许多C++程序员喜欢通过指针将可修改参数传递给函数,不可修改的小参数按值调用传递,而不可修改的大参数常用引用传递给参数。
4. 构造函数与析构函数的执行顺序
全局范围中定义的对象的构造函数在文件中的任何其他函数(包括main)执行之前调用(但不同文件之间全局对象构造函数的执行顺序是不确定的)。当main终止或调用exit函数时调用相应的析构函数。
static局部对象的构造函数只在程序首次执行到达对象定义时调用一次,对应的析构函数在main终止或调用exit函数时调用。
不要返回对private数据成员的引用
const对象的构造函数和析构函数不需要const声明。构造函数应允许修改对象,这样才能正确的将对象初始化。析构函数应能在对象删除之前进行清理工作。
7. this指针
对象的this指针不是对象本身的一部分,即this指针不在对该对象进行sizeof操作的结果中体现。但this指针在每次非staitc成员函数调用对象时作为第一个隐式参数传递给对象(通过编译器)
this指针的类型取决于对象类型和使用this的成员函数是否声明为cosnt。在Employee类的非常量成员函数中,this的类型是Employee*const(Employee对象 的常量指针)。在Employee类的常量成员函数中,this指针的类型为cosnt Employee*const(常量Employee对象 的常量指针)
8.
为了节约存储空间,每个类的每个成员函数只有一个副本,该类的每个对象都可以调用这个成员函数。另一方面,每个对象又有自己的类数据成员副本。
9.
this指针的一个有趣的用法是防止对象赋值给自己。自我赋值可能在对象包含动态分配内存的指针时导致严重的错误。
10.
函数原型和定义中都要指定const
const成员函数可以用非const版本重载。编译器根据对象是否声明为const自动选择所用的重载版本。
const对象应初始化。要用成员初始化值向构造函数提供类对象数据成员的初始值。
11.
友元关系声明可以放在类中任何地方。
类的友元函数在类范围之外定义,但有权访问类的所有成员。
12.
虚函数与性能
多态性(它是用虚函数和动态关联实现的)是高效的,程序员使用这种功能对系统性能的影响极小。
虚函数和动态关联使得多态性编程和switch逻辑编程形成了对照。C++优化编译器通常能够生成至少和手写的基于switch逻辑的代码具有同样效率的代码。对大多数应用程序而言,多态的开销是可以接受的。但有时则不能接受多态的开销,例如性能要求很高的实时应用程序。
在STL组件中是不使用多态和虚函数的,这是为了避免运行开销,从而达到符合STL特定要求的最优性能。
13.
c++中的虚继承是针对多重继承中可能出现的问题而提出的。菱形继承