1. C语言中const关键字
const 在编程中应用比较广泛,const 是 constant 的缩写,意思是“恒定不变的”! 它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。
用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋给相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。
用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程。全局变量的生存周期为程序运行的整个过程这个是理所当然的。而使用 const 修饰过的局部变量就有了静态特性,它的生存周期也是程序运行的整个过程。全局变量是静态的,静态的生存周期就是程序运行的整个过程。但是用const修饰过的局部变量只是有了静态特性,并没有说它变成了静态变量。
局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量。举个例子:
(1) 定义常量必须初始化;
const int i = 5; //合法
const int j; //非法,导致编译错误
(2) 在另一连接文件中引用const常量
extern const int i; //合法
extern const int j=10; //非法,常量不可以被再次赋值
(3) 定义指向常量的指针:
int a = 10;
int b = 100;
const int *p1 = &a;
const 和变量类型 int 可以互换位置,二者是等价的,即上条语句等价于:
int const *p1 = &a;
*p1 = 111; //错误,指针指向内存区域不能修改
p1 = &b; //正确,指针指向可以变
(4) 定义指针常量:
int a = 10;
int b = 100;
int * const p2 = &a;
p2 = &b; //错误,指针指向不能变
*p2 = 222; //正确,指针指向的内存可以修改
(5) 定义指向常量对象的常量指针
int a = 10;
int b = 100;
const int * const pp=&a; //指针和指针指向的内容都为不可变量。
p2 = &b; //错误,指针指向不能变
*p2 = 222; //错误,指针指向的内容不可变
(6) 定义字符串
const char *pc = “abcde”; //分配在常量区
(7) 通过指针可以修改常量
const int a = 100;
int *p1 = (int*)&a;
int *p2 = (int*)&b;
* p1 = 101;
printf(“a = %d\n”, a);// 输出的结果是101
2. C++语言中const关键字
C语言和C++中的const有很大区别。在C语言中用const修饰的变量仍然是一个变量;
而在C++中用const修饰过后,就变成常量了。
(1) 定义数组
const int n=5;
int a[n];
这种方式在C语言中会报错,原因在于声明数组时数组的长度必须为一个constant,即常量,虽然n用const限定了,但n终究是一个变量,因此会报错;但是在C++中不会报错,因为在C++中用const修饰过后,n就已经等同于一个常量了,因此可以通过。
(2) volatile 关键字跟 const 对应相反,是易变的,容易改变的意思。所以不会被编译器优化,编译器也就不会改变对a变量的操作
const int a = 100;
volatile const int b = 100;
int *p1 = (int*)&a;
int *p2 = (int*)&b;
* p1 = 101;
* p2 = 102;
cout << a << endl;// 输出的结果仍然是100
cout << b << endl;// 输出的结果则是102
(3) 定义类的成员函数,类的成员变量不可变
class Test
{
public:
Test() {}
Test(int m) :cm(m) {}
int get_cm()const
{
cm = 10; //非法,不可修改的左值
return cm;
}
private:
int cm;
};