C和C++的区别三【const的修饰】
在C语言中
1)const修饰的变量称为常变量,在定义时可以进行初始化,也可以不初始化;但是如果在定义时未初始化的情况下,以后都不能在修改了,所在一般在定义时都进行了初始化;
例如:
const int num = 10;
const int b;
b = 20;//error
2)由于这个常变量本质还是一个变量,所以不可用于数组的下标;
例如:
const int num = 10;
//int array[num] = {0};error
3)在本文件引用其他文件中的const修饰的量时,跟普通变量一样,只要在本文件中加extern声明一下即可;
4)由于这个常变量本质还是一个变量,我们可以定义指针通过解引用来改变变量的值;
例如:
int main()
{
const int a = 10;
int *p = (int *)&a;
*p = 20;
printf("a = %d\n",a);
printf("*p = %d\n",*p);
return 0;
}
上述代码图解:
所以说常变量是一种特殊的变量,它的编译方式和普通变量的编译方式一摸一样,只是常变量不能作为左值而已
在C++中
1)const修饰的变量称为常量,在定义时必须进行初始化,因为在C++的编译规则中,与编译阶段,所有使用常量所在的地方都被替换成它的初始值;
例如:
const int a = 10;
//a = 12;//error;在C++中const一旦初始化后则不能改变
const int s;//在C++中const是常量必须初始化
2)由于本质是一个常量,所以可用于数组的下标;
例如:
const int a = 10;
int arr[a];//合法
3)在本文件引用其他文件中的const修饰的量时,它的作用域为local,本文件所有,所以需要在const常量定义处外加extern,因为在编译时它会直接在文件中展开;
例如:
//test1.cpp文件中
const int baby = 10;
//test2.cpp文件中
extern const int baby;
int main()
{
const int b = baby;
}
结果:
1>C和C++的区别.obj : error LNK2001: 无法解析的外部符号 "int const baby" (?baby@@3HB)
1>D:\vs练习代码\C++\C++复习\Debug\C++复习.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
::若想使得作用域变为global,则在定义处前加extern,则编译的时候当作global符号进行处理,则其他文件中可用;
4)由于本质是一个常量,我们不可以定义指针通过解引用来改变变量的值;
const int a = 10;
int *p = (int *)&a;
*p = 20;//error
5)引用一个编译阶段不明确的值的时候是常变量 常量-------》常变量;
例如:
int main()
{
int a = 10;
const int b = a;
int *p = (int *)&b;
*p = 20;
cout<<b<<endl;
cout<<*p<<endl;
}
结果:
所以说可以被修改,所以这块是常变量;(而不是常量了);