1.const 含义
在 C/C++ 语言中,const关键字是一种修饰符。所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有只读的特点。在编译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。
2.const作用
,const修饰符的作用主要是利用编译器帮助我们检查自己代码的正确性。我们使用const在源码中标示出“不应该改变”的地方,然后利用编译器,帮助我们检查这些地方是否真的没有被改变过。如果我们不小心去修改了这些地方,编译器就会报错,从而帮助我们纠正错误。使用const和不使用const,对于最终编译产生的代码并没有影响。虽然const对于最终代码没有影响,但是尽可能使用const,将帮助我们避免很多错误,提高程序正确率。
3.const用法
C语言 :
① const 定义的变量可以初始化,也可以不初始化
② const修饰的量不能用于左值
③ 不能当作常量来使用,其实const修饰的应该叫做常变量
④ 常变量const的编译方式,和普通变量的编译方式一样
C++:
① const修饰的变量一定要初始化
② const定义的量叫做 常量,这是真常量,可以用其来定义数组长度
③ C++的常量也可以变为常变量,例如 如下代码:
int b =20;
const int a = b;
int array[a] ={0}; // 出错,编译时期b值不确定,且b为变量,不能用变量定义数组大小
④ 常量const的编译方式:若初始化给出立即数, 在编译时期,拿常量的值把常量的名字替换掉,若用变量初始化,将退化为常变量。
4.在有const的代码段中,一般出现问题,主要原因是:
(1)作为左值使用
const int b = 50;
b = 20;
(2)把const常量的地址或者引用给泄露出去了
const int a = 20;
int *p = &a; // 泄露a的地址,可能会修改a,可修改为 const int *p = &a
int &b = a;
5.const和指针的结合使用(常考点)
(1)const和一级指针的结合
int a = 10;
const int *p = &a; // const修饰 *p, 即*p不可改变, 但p的指向可以改变
int const *p = &a; // 同上
int *const p = &a; // p的指向不可改变, 但 *p可以修改
// int * = const int * err
// const int * = int * ok
(2)常引用变量,才能引用常量
const int a = 10;
const int &b = a; // const与引用结合这只有一种形式
(3)const和二级指针的结合
int a = 10;
int *p = &a;
// const int ** = int ** err
// int ** = const int ** err
// int * = const int * err
// const int * = int * ok
// int *const * = int** ok
// int ** = int *const * err
// int **const = int** ok
// int *const * = const int** err