1. 声明与定义的区别
一般来说我们把分配变量(函数)地址和存储空间的称为定义,不分配地址的称为声明。声明只是告诉编译器,有这个变量(函数),具体在哪里让它自己去找。对同一个变量(函数)的声明可以有多次,而定义只能有一次!所有头文件中一般都是变量(函数)的声明,头文件中一般都是变量(函数)的声明定义(const修饰的变量除外)。
2. extern
extern有两个作用。
第一个,与"C"一起连用,如:
extern "C" void fun(int a, int b);
告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的, C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这取决于编译的规则,主要是为了支持函数重载。
第二个, 置于变量(函数)名前,如:
extern int nExistValue;
告诉编译器,其后的变量(函数)已经在其他地方中被定义了,并且把该变量(函数)的作用域扩展到该语句所在的作用域。
注意:当变量带初始化式时,就算前面有extent,也是一个定义。即extent相当于没有。
3.static
static修饰变量时,告诉编译器,该变量保存在内存的静态区。即便函数运行结束,而静态变量的值都不会被销毁,以后仍然还可以继续使用。未指定初始值的静态变量会被程序自动初始化为0。
static修饰的函数和变量都只能在本编译单元中使用。
注意:static与extern“水火不容”,也就是说extern和static不能同时修饰一个变量。
4.const
const修饰的变量在定义时必须被初始化,其后不能被修改。const最初是用来代替define的。define是宏定义,在预编译期简单的替换,不会进行类型检查,而且define没作用域的限制。const修饰的是一个不能被修改的变量,本质上还是一个变量,会进行类型检查,也有作用域的限制。
在类的成员函数中,可用const修饰函数,如:
class classname { public: int fun() const; ..... }
表示该函数不会修改该类的成员变量。