C和C++区别——const
2017-10-28 20:49
183 查看
const在C和C++中的区别:
C语言:
用const修饰的量都是不能修改的量。下图修改a就会报错。
![](https://img-blog.csdn.net/20171029223011695?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
C语言里面const修饰的值没有初始化 依旧编译成功,所以,const修饰的值不是必须初始化。
![](https://img-blog.csdn.net/20171029223302146?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
但是要是不初始化的话,以后你就不能给它一个合法的值,所以一般还是要初始化的。
既然const的值不能被修改,那么,这个值能不能作数组下标呢?如下图,是不可以的,因为在C语言中const修饰的量是常变量,本质是变量。
![](https://img-blog.csdn.net/20171029223812946?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
那么再来看一个图:
![](https://img-blog.csdn.net/20171029225136600?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
上图中,用一个指针p指向a的地址,然后对指针解引用赋值为30,可以修改a的值,
那么C语言里面const修饰的常变量和普通变量唯一的区别:常变量定义以后,不能作为左值存在,其他都是一样的。
常变量和普通变量,编译方式相同。
![](https://img-blog.csdn.net/20171029231022819?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在外部定义.c文件,在本文件(.c)中引用是不会出错的,因为在外部const修饰的变量生成的符号是global的,整个工程都可见。
C++:
C++里面const修饰的值必须初始化(编译器规则),如下图:
![](https://img-blog.csdn.net/20171029231910966?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在C++里面,const修饰的值,是常量,可以作为数组下标,(const的编译规则:所有使用常量名字的地方全部替换成常量的初始值),在编译的时候直接把a替换成10了,如下图:
![](https://img-blog.csdn.net/20171029232429672?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
C++里面,同样的代码,打印出来10和30:
![](https://img-blog.csdn.net/20171029233513383?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
因为常量不会被修改,所以a的值就不会改变,在编译的时候已经直接把a替换成10了,为什么&a的值没有改变呢因为,p引用a的地址,地址不会改变,引用常量值的时候是会改变的。
那在什么时候C++中的const会退化成和C语言一样的常变量呢?
那就是当它引用一个编译阶段不明确的值的时候,就会退化成常变量。如下图:
![](https://img-blog.csdn.net/20171029234230043?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在编译阶段,a的值是不明确的,此时a不能作为数组下标,此时的a是常变量,打印出来和C语言中一样,如下图:
![](https://img-blog.csdn.net/20171029234722588?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
那么在c++外面定义一个const在本文件中(.cpp)中调用会不会成功呢?如下图,不会成功
![](https://img-blog.csdn.net/20171029235614050?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem1fMjIwOTA2ODE3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
为什么呢?因为在C++里面const修饰的值生成的符号属性都是 local 的,也就是说const修饰的量的值只在当前文件可见,为什么只在当前文件可见呢?因为C++里面,const修饰的值直接在编译阶段进行替换的,编译只针对本文件进行编译,其他文件看不到,所以生成符号是local的,只在本文件可见,其他文件无法调用。
如果想让其他文件访问的话,就在const常量定义处加extern,符号就变为global的了,外部文件就可以访问了,
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的了,外部文件就可以访问了,
相关文章推荐
- C++中const迭代器和const_iterator的区别
- 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
- C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析
- 1.C和C++区别,以及const分析
- C++中const迭代器 和 const_iterator的区别
- java的修饰引用变量的final和C++的const区别真的很大
- C/C++ const与#define区别
- C++中const迭代器 和 const_iterator的区别
- java中的final与C++中的const的区别
- C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析
- c++中使用const关键字的联系区别
- const 在c和c++中的区别
- C++中const在函数名前面和函数后面的区别
- C++中const迭代器 和 const_iterator的区别
- const在C语言和C++中的区别
- c++语法之const int*p 与const * int p的区别
- 细究C++中const_iterator与const迭代器的区别
- const在C和C++中的区别
- C++中define与const的区别
- const在c/c++中的区别