专业编程基础技术教程

网站首页 > 基础教程 正文

C/C++ const关键字总结

ccvgpt 2024-08-08 12:55:39 基础教程 10 ℃

1. C语言中const关键字

const 在编程中应用比较广泛,const 是 constant 的缩写,意思是“恒定不变的”! 它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。

C/C++ 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;
};

Tags:

最近发表
标签列表