C++和C语言中const关键字的区别
**
1. 内存读取的区别
先来看下面的代码
const int m = 10;
int n = m;
C++中的const关键字更像是编译阶段的#define。
在C语言中,编译器会先到 m 所在的内存取出一份数据,再将这份数据赋给 n;而在C++中,编译器会直接将 10 赋给 m,没有读取内存的过程,和int n = 10;的效果一样。C++ 中的常量更类似于#define命令,是一个值替换的过程,只不过#define是在预处理阶段替换,而常量是在编译阶段替换.
C++ 对 const 的处理少了读取内存的过程,优点是提高了程序执行效率,缺点是不能反映内存的变化,一旦 const 变量被修改,C++ 就不能取得最新的值。
代码验证:
先来看C中的例子
1 #include <stdio.h>
2 int main(void)
3 {
4 const int n = 10;
5 //将const int*强制转换成int*
6 int* p = (int*)&n;
7 *p = 100;
8 printf("n=%d,*p = %d\n",n,*p);
9 return 0;
10 }
这段代码输出的结果是 n=100,*p = 100
再看C++中的例子:
1 #include <iostream>
2 using namespace std;
3 int main(void){
4 const int n = 10;
5 int* p = (int*)&n;
6 *p = 100;
7 cout << n <<" " << *p << endl;
8 return 0;
9 }
这段代码输出的结果是10 100
本例想说明的是:
C语言对 const 的处理和普通变量一样,会到内存中读取数据;C++ 对 const 的处理更像是编译时期的#define,是一个值替换的过程。
2 作用域的区别
** C++中全局 const 变量的可见范围是当前文件 而在C语言中,const 变量和普通变量一样,在其他源文件中也是可见的**
由于 C++ 中全局 const 变量的可见范围仅限于当前源文件,所以可以将它放在头文件中,这样即使头文件被包含多次也不会出错。