A .函数探幽:
1. 要使用内联函数需要做:a. 在函数声明之前加上关键字inline; b.在函数定义前面加上关键字inline; 内联函数的原始实现是宏!
2. 声明引用时必须进行初始化! (const指针也是在创建时进行初始化)
3. 如何给参数设置默认值?必须通过函数原型。因为编译器是通过查看原型来了解函数所使用的参数数目,因此函数原型也必须将可能的默认参数告知程序。必须从右向左添加默认值。
4. 函数在重载时,编译器在检查函数特征标(参数类型)时,将把类型引用和类型本身视为同一个特征标。匹配函数时,不区分const和非const变量。
B . 内存模型和名称空间:
1. 不要将函数定义或变量声明放到头文件中。为了避免在不知情的情况下将同一头文件包含多次,可以使用预处理器编译指令#ifndef,代码为:#ifndef COORDIN_H_ #define COORDIN_H_ ... #endif
2. 在c++中,可以使用register来声明局部变量,作用域为局部,没有链接性。因为存储在寄存器中,没有内存地址,因此不能使用地址操作符。register int x;
3. 静态存储持续性变量(在整个程序执行期间存在)有3种链接性:外部链接性、内部链接性和无链接性。下面给出代码:
int global=1000; //静态持续变量,外链接,在代码块的外面声明
static int one_file=50; //静态持续变量,内联接,代码快外面声明,并使用static限定符
int main()
{...}
void func1(int n)
{
static int count=0; //静态持续变量,没有链接性,只能在func1种使用。在代码块内声明,使用static限定符
}
所有的静态持续变量都有两个初始化特征:a.未被初始化的静态变量的所有位都被设为0;b.只能用常量表达式来初始化静态变量。
对于外部链接性变量,有且仅有一个文件中包含了该变量的外部定义,其他文件要使用该变量,必须在引用声明中使用extern.
4. c++不允许在一个函数中定义另外一个函数,因此所有函数的存储持续性都自动为静态的,即在整个程序执行期间都一致存在。默认情况下,函数的链接性为外部的。可以用static将函数的链接性设置为内部的。
5. 在c++中,同一个名称可能对应多个函数,在编译期间,必须为这些函数提供不同的符号名称。例如可以将spiff(int)转换为_spiff_i,而将spiff(double,double);转换为_spiff_d_d,这称为c++语言链接。而extern "c" void spiff(int); 表示以c的语言链接性来查找函数。
6. using声明:假如存在一个名称空间 namespace Jill{double bucket(double n){...} double fetch;} 则using Jill::fetch;就是一个using声明。using声明在函数内时,则声明的变量是局部的,如果声明在函数外,则声明的变量是全局的。
7. using声明使得一个名称可用,而using编译指令使得所有的名称都可用。 using namespace Jill; 不要在头文件中使用using编译指令
C .对象和类:
1. 不用在类中使用private,这是类对象的默认访问控制。类和结构的唯一区别在于,结构的默认访问类型是public的。
2. cout和cerr的区别:cout对应于标准输出流,cerr对应于标准错误流; cout可以重定向,cerr不可以;cout要分配缓冲,因此cerr比cout快;它们的 标准默认输出设备都是屏幕。
3. 类的每个对象都有自己的存储空间,用于存储其内部变量;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。
4. 默认构造函数是在未提供显式的初始化值时,被用来创建对象的构造函数。例如:Stock stock1; 当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为雷定义了构造函数后,程序员就必须为它提供默认构造函数。否则Stock stock1;这样的声明将出错。
5. const成员函数:void show()const; 其对应的定义为void Stock::show()const; 表明在这个类方法中不会修改调用对象。
6. 使类中的某个变量为整个类都可用。a.可以在类中声明一个枚举。在类中声明的枚举的作用域为整个类,例如: class Stock{ private: enum{Len=30};}; 所有的对象都不包含枚举!!! b.使用static: class Stack{ private: static const int Len=30;}; 这将创建一个Len常量,该常量不存储在对象中,而与其他的静态变量存储在一起!!