目录
前言
C++在const的使用上相较于C更为严谨了,下面我们将分别介绍const在C语言中和C++中的使用情况,再进行总结比较。
一、C语言中的const
我们知道,const是翻译过来的意思为常量,常数。这意味着const有“不变”的含义。但是,C语言中的const修饰的变量真的是无法改变的吗?其实不然,在某些情况下const修饰的变量的值是可以被我们所改变的。下面我们慢慢分析。
1.const修饰的全局变量
在C语言中,const修饰的全局变量保存在常量区,既不能通过变量名去修改,也不能通过地址去修改。
可以看到,当我们想通过变量名去修改值的时候,编译器给我们报错。
当我们想通过地址去修改时,编译器在调试的时候会引发异常而终止。
2.const修饰的局部变量
const修饰的局部变量,存在栈区,虽然不能通过const修饰的变量去修改栈区的内容,但是可以通过地址去改变。
可以看到,当我们用指针指向const修饰的局部变量的地址时,可以通过指针将变量里的值进行修改。
3.const修饰的全局变量默认为外部链接属性
const修饰的全局变量,如果其他文件想使用,直接extern声明外部可用即可。
打印结果如下:
二、C++中的const
C++中的const我们也像C一样从三个方面分析,看看究竟有什么异同。
1.const修饰的全局变量
在C++中,const修饰的全局变量与C语言中的情况是一样的,既不能通过变量名去修改,也不能通过地址去修改。这里就不用代码进行演示了。
2.const修饰的局部变量
在C语言中,const修饰的局部变量可以通过地址来改变,但是C++中的情况却不是这样子的。C++既不能通过变量名修改局部变量的值,也不能通过地址来改变const修饰的局部变量的值。
可以看到,虽然编译器没有报错,但是输出的值并没有改变,这是为什么呢? 在C++中,const修饰的局部变量保存在符号表中,修改不了,是一个常量。
3. const修饰的全局变量默认为内部链接属性
C++中const修饰的全局变量默认为内部链接属性,加上extern修饰变为外部链接属性。
编译结果出错:
当我们加上extern关键字,使其变为外部链接属性时,其他文件才能正常使用。
编译结果如下:
总结
C/C++中const的主要异同点如下:
同:C和C++中const修饰的全局变量保存在常量区,不能被修改。
不同:
(1)C中const修饰的局部变量赋值为常量时,局部变量保存在栈区,可以被指针修改;C++中const修饰的局部变量赋值为常量时,局部变量保存在符号表,不能被修改。
(2)C中const修饰的全局变量默认为外部链接属性;C++中const修饰的全局变量默认为内部链接属性。