extern,static,const的具体分析。
extern:
extern后加变量,或者函数,都是声明符号在其他地方已声明或定义,需要去其他地方寻找这些声明。
如
int n;
int N(){
retrun n;
}
如果写在函数中,则为函数内的局部变量,如果写在类中,则为类内的局部变量。若其写在外侧,也就是不包含在任何类或者函数中时,说明它就是一个全局变量,这时,它在编译时,会出现在导出符号表中,而其他的cpp中若再次声明,则为重声明错误。要在其他cpp中使用则要先声明
extern int n;
extern int N();
这里的extern告诉编译器,这里是引用一个外部变量,让链接器去其他cpp中寻找n这个符号。
extern 还可以用extern "C" 来表明接下来的一段内容是用c的规则去编译。如:
extern "C" {
#include "XX.h"
}
extern "C" int plus(int p){
return ++p;
}
static:
static声明变量是一个静态变量。变量分为全局变量,静态全局变量,局部变量,和静态局部变量。只有非静态的局部变量保存在动态储存区,其他都储存在静态储存区
对于静态的外部变量:
只能在本文件中使用,其他文件中无法使用。本文件指的是对应的头文件和cpp文件,显然,头文件编译时是直接粘贴到cpp中include处的,这个概念要理解啊。
对于函数的静态变量:
函数中的局部静态变量,由于存储在静态储存区,在函数调用结束后,内存不会释放,所以它的值会保留上一次函数调用的结果。静态局部变量不能被其他函数所调用,其作用域只在函数中。
对于类中的静态变量:
类内的静态变量是属于类的,不属于对象,类内只有常量可以同时定义声明,又静态变量也不能在构造函数上定义,所以,一般在cpp文件中这样定义:
class aClass{
static int aa;
};
int aClass::aa=5;
这里不用static也不能再用static。若未对类内静态变量初始化,则其值为0.
const:
常量都储存于静态储存区。
外部的常量:
可以直接在头文件同时进行声明和定义,也可以只在头文件中声明,在cpp中定义
const int cs=0;
extern const int sc;
const int sc=5;
对于类内的常量:
由于也不能直接在类内声明时同时定义,所以一般在使用构造函数时,使用参数初始化列表来进行初始化:
class bClass{
const int constint;
bClass():constint(5){};
};
两个其实是相同的。
定义外部的静态常量时,可以直接初始化,也可以在cpp中进行初始化:
const static int cs=0;
extern const int sc;
static const int sc=5;
在类内,就可以直接初始化了
class bClass{
const static int cs=0;
static const int sc=1;
};