您的位置:首页 > 编程语言 > C语言/C++

C和C++区别——const

2017-10-28 20:49 183 查看
const在C和C++中的区别:

C语言:
用const修饰的量都是不能修改的量。下图修改a就会报错。



C语言里面const修饰的值没有初始化 依旧编译成功,所以,const修饰的值不是必须初始化。



但是要是不初始化的话,以后你就不能给它一个合法的值,所以一般还是要初始化的。

既然const的值不能被修改,那么,这个值能不能作数组下标呢?如下图,是不可以的,因为在C语言中const修饰的量是常变量,本质是变量。



那么再来看一个图:



上图中,用一个指针p指向a的地址,然后对指针解引用赋值为30,可以修改a的值,
那么C语言里面const修饰的常变量和普通变量唯一的区别:常变量定义以后,不能作为左值存在,其他都是一样的。

常变量和普通变量,编译方式相同。



在外部定义.c文件,在本文件(.c)中引用是不会出错的,因为在外部const修饰的变量生成的符号是global的,整个工程都可见。

C++:

C++里面const修饰的值必须初始化(编译器规则),如下图:



在C++里面,const修饰的值,是常量,可以作为数组下标,(const的编译规则:所有使用常量名字的地方全部替换成常量的初始值),在编译的时候直接把a替换成10了,如下图:



C++里面,同样的代码,打印出来10和30:



因为常量不会被修改,所以a的值就不会改变,在编译的时候已经直接把a替换成10了,为什么&a的值没有改变呢因为,p引用a的地址,地址不会改变,引用常量值的时候是会改变的。

那在什么时候C++中的const会退化成和C语言一样的常变量呢?
那就是当它引用一个编译阶段不明确的值的时候,就会退化成常变量。如下图:



在编译阶段,a的值是不明确的,此时a不能作为数组下标,此时的a是常变量,打印出来和C语言中一样,如下图:



那么在c++外面定义一个const在本文件中(.cpp)中调用会不会成功呢?如下图,不会成功



为什么呢?因为在C++里面const修饰的值生成的符号属性都是 local 的,也就是说const修饰的量的值只在当前文件可见,为什么只在当前文件可见呢?因为C++里面,const修饰的值直接在编译阶段进行替换的,编译只针对本文件进行编译,其他文件看不到,所以生成符号是local的,只在本文件可见,其他文件无法调用。

如果想让其他文件访问的话,就在const常量定义处加extern,符号就变为global的了,外部文件就可以访问了,

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: