6.1 const 修饰的局部常量 -- 是否可以修改
一句话: const 修饰的局部常量, 在 C++中不能间接修改(储存在符号表中)
在 C 中可以间接修改 (储存在栈上)
const 修饰的全局常量,对于 C 言语 和 C++ 基本没有区别,直接间接都不能修改
==============================================================================
具体有:
C 语言中: 是伪常量 不能初始化数组
const 修饰的全局常量
储存:常量区
直接修改:不能修改;语法错误
间接修改:不能修改;语法没错误,但由于常量区保护,也不能修改
--------------------------------------------------------------------------------------------
const 修饰的局部常量
储存:栈区
直接修改:不能修改;语法错误
间接修改:能修改
==============================================================================
C++ 中: 是常量 可以初始化数组
const 修饰的全局常量
储存:常量区
直接修改:不能修改;语法错误
间接修改:不能修改;语法没错误,但由于常量区保护,也不能修改
-----------------------------------------------------------------------------------------
const 修饰的局部常量
储存:符号表
直接修改:不能修改;语法错误
间接修改:不能修改,但修改不报错,间接修改的是临时变量,不会有语法错误,但不会修改成功
==============================================================================
1) C++ 中 间接修改 const 修饰的局部常量 的过程:
void test()
{
// 过程:
const int a = 20; // int temp = a;
int *p = (int *)&a; // int *p = (int *)&temp;
*p = 1000; // temp 的值改变了 但 a 的值并没有变
}
2)符号表
符号表中 key 与 value 是一种对应关系
C++中 定义了局部常量 const int a = 20
此时 key => a value => 20
以后运算时候,出现 a ,编译器回去寻找 key 对应的 value 值,并替换
符号表中的值也是收到保护的,无法被修改
6.2 const 修饰的全局常量 -- 内部链接 or 外部链接
内部链接 or 外部链接 ----- 其实就是在说作用域的问题 !!!
C 语言中 const 修饰的常量 默认是“ 外部链接”
例如:
文件 1 中定义全局常量: const int a = 10;
文件 2 中:
int main()
{
extern const int a; // extern 告知编译器:其他文件中有 const int a = 10,此处不要报错
printf("%d", a); // 链接时候发现真有,输出结果 10
system("pause");
return 0;
}
文件 1 中: const int a = 10; C 语言中默认就是 extern const int a = 10; 因此不会报错
****************************************************************************************
C++ 中 const 修饰的常量 默认是“ 内部链接”
例如:
文件 1 中定义全局常量: const int a = 10;
文件 2 中:
int main()
{
extern const int a;
// 链接时候,编译器去文件 1 中寻找到常量 a
// 但发现是 a 的作用域只是文件 1 中,文件 2 中无法使用,因此报错
printf("%d", a); // err:一个无法解析的外部命令
system("pause");
return 0;
}
正确写法: 文件 1 中: extern const int a = 10
小结:
const 修饰的全局常量
在 C 语言中,其作用域是所有文件,默认加前缀 extern
在 C++ 中,其作用域只是在所定义的文件中,想作用于其他文件,必须加加前缀 extern
****************************************************************************************
注意比较:以上说的都是全局常量,
但如果定义的是全局变量,无论在 C 语言还是在 C++中都不报错,没有区别
6.3 C++ 中尽可能采用 const 常量代替宏常量
原因 1:宏常量没有类型
#define MAX 1000
void func( int a) {
cout << "int "<< a << endl;
}
void func(short a) {
cout << "short " << a << endl;
}
int main()
{
func(MAX); // 结果: int 1000 // 1000,默认是 int 型,所以无法调用下方的函数
const short max = 1000; // 如果使用 const,可以指定类型,就可以随意调用
func(max); // short 1000
}
------------------------------------------------------------------------------------------------------------------------------------
原因 2: 如果某些位置不使用该宏,宏常量需要手动卸载
const 常量有相应的作用域,使用更加灵活