C中const的用法:
1, 在定义变量时使用(由于const常量在定义后不能被修改,所以在定义时一定要进行初始化操作):
a) 最简单的用法,说明变量为一个常变量(在以下例子里,int 和const的先后顺序可以改变的,这无所谓):const int a=100;
int const b=100;
b) 说明指针为指向常数的指针,即指针本身的值是可以改变的:
const int *a=&b;
c) 说明指针本身的值不可改变,但指向的内容可改变:
int * const a = &b;
d) 说明指针为指向常数的常指针,即指针本身与指针指向的内容都不可改变:
const int * const a = &b;
e) 说明引用为常数引用,即不能改变引用的值:
const int &a=100。
f) 作为参数使用,说明函数体内是不能修改该参数的:
void func(const int a);
g) 作为返回值使用,说明函数的返回值是不能被修改的:
const int func();
h) 在函数中使用const,情况与定义变量的情况基本一致:
C++中区别于C的const用法:1, const类成员
const类成员在对象构造期间被初始化(成员初始化列表)并且在以后不允许被改变。const类成员和一般的const变量有所不同。const类成员是对应于每个对象而言,它在对象构造期间被初始化,
在这个对象的生存周期中不允许被改变。
2, const 成员函数const 成员函数不允许在此函数体内对此函数对应的类的所有成员变量进行修改,这样可以提高程序的健壮性。Const一般放
在函数体后。
3,const在C和C++中最大的不同是,在C中,const默认具有外部链接,而C++中则是内部链接。所以当你只在定义const常量的文件中使用该常量时,c++不给你的const常量分配空间,此时
const int c = 0;
相当于
#define c 0;
而在C中,它会给每个const 常量分配内存空间
静态类型(static)
用静态类型关键字static说明的变量称为静态变量。static可以修饰局部变量和全局变量。因此静态变量分为静态局部变量和静态全局变量。
定义格式:
static 类型 变量名;
在C与C++中静态局部变量有默认值,默认值分别为int 型等于0,float型等于0.0,char型位'\0',静态全局变量也是如此.
1. 静态局部变量
定义在函数内的静态变量称为静态局部变量。
特点如下:
(1) 静态局部变量也是局部变量,具有局部变量的作用域,当离开该函数体后,不可使用改变量,但其只能还继续保留,静态局部变量的存储空间不会被释放。
(2) 静态局部变量在程序运行开始就被分配了固定的存储单元(静态存储区),生存期是整个程序的运行期间。
(3) 静态局部变量的赋初值时间在编译阶段,仅初始化一次。当再次调用该函数时,静态局部变量会保留上次调用函数时的值。
2.静态全局变量和函数
用来表示不能被其它文件访问的全局变量和函数。
为了限制全局变量/函数的作用域, 函数或变量前加static。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区, 生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
在C++中:
静态数据成员/成员函数:
表示属于一个类而不是属于此类的任何特定对象的变量和函数(这是与普通成员函数的最大区别)。
都可以通过对象或者类名来访问。
静态数据成员定义如下:
static 类型标识符 静态数据成员;
初始化:
类型标识符 类名::静态数据成员名 =初始值;
静态成员函数特点:
静态成员函数可以直接调用静态数据成员和静态成员函数,不能直接访问非静态数据成员和非静态成员函数,如果非要访问可通过对象来引用。
extern (外部类型)
它的作用在于告诉编译器:这个变量或者函数的定义在别的地方,当遇到此变量或函数时应到其他模块中寻找其定义。
在一个文件中定义的全局变量默认是外部的,及其作用域可以延伸到程序的其他文件中。但其他文件要使用这个文件中定义的全局变量,必须在使用前用extern作外部声明,外部声明通常放在文件的开头。变量定义时编译器为其分配存储空间,而变量声明指明该全局变量已在其他地方说明过,编译时系统不再分配存储空间,直接使用变量定义时所分配的空间。
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。