C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢?本文将对这两个问题进行一些分析,需要了解的朋友可以参考下
问题 

C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢? 本文将对这两个问题进行一些分析,简单解释const的含义以及实现机制。 



问题分析 

简单的说const在C语言中表示只读的变量,而在C++语言中表示常量。关于const在C与C++语言中的使用以及更多的区别,以后有时间另开一贴说明。



那么const究竟是如何实现的呢? 对于声明为const的内置类型,例如int,short,long等等,编译器会如何实现const的本意?那么对于非内置类型是否也是与内置数据类型一样处理呢,例如对于结构体类型则会怎样处理呢?下面通过几个小例子来说明这些问题: 

C语言const示例

复制代码代码如下:


const int i=10; 

int *p=(int *)(&i); 

*p=20; 

printf("i=%d *p=%d \n",i,*p); 

猜一猜输出结果是什么? i=20 *p=20 

C++语言const示例1:

复制代码代码如下:


const int i=10; 

int *p=const_cast<int *>(&i); 

*p=20; 



cout<<"i="<<i<<" *p="<<*p<<endl; 

输出结果是 i=10 *p=20 

C++语言const示例2:

复制代码代码如下:


struct test{ 

int j; 

char tmp; 

test() 



j=30; 

tmp='a'; 



}; 

int main(int argc, char* argv[]) 



const struct test t1; 

int *q=(int *)(&t1.j); 

*q=40; 

cout<<"j="<<t1.j<<" *q="<<*q<<endl; 

return 0; 


输出结果是 j=40 *q=40 



示例结果分析 

看到上面三组输出结果,有没有感到很诡异: 

问题1,对于const int类型的变量i,C语言中通过指针p修改了值后,i变成了20;而在C++中,通过指针p修改了值后,i仍然是10。 

问题2,C++语言中 const struct test的元素j通过指针q被改变了,为何const int 与 const struct test的反应机制不同? 



针对问题1,我们知道C语言中const表示只读的变量,既然把const看成是变量,那么其在内存中就会有存储他的空间,并且可以通过指针间接的改变该内存空间的值,当通过指针p改变该内存中的值后,再获取i的值的时候,会访问该空间,得到的是被改变后的值。而C++把const看做常量,编译器会使用常数直接替换掉对i的引用,例如cout<<i; 会理解成cout<<10; 并不会去访问i的内存地址去取数据,这里有点像是C语言里的宏#define i 10。因此C++里i会输出10,而*p会输出20. 



针对问题2,C++语言中只是对于内置数据类型做常数替换,而对于像结构体这样的非内置数据类型则不会。因为结构体类型不是内置数据类型,编译器不知道如何直接替换,因此必须要访问内存去取数据,而访问内存去取数据必然会取到被指针q改变后的值,因此会造成与C++中const int类型完全不一样的处理模式。 



小结 

C语言与C++有很多的区别与联系,const只是其中一个方面,对于const的理解和使用是编程的基础,需要熟练掌握。

最新文章

  1. C++的内存泄漏检测
  2. [C#] 进阶 - LINQ 标准查询操作概述
  3. Hibernate 异常提示_1
  4. php的Excel相关操作
  5. 【20160924】GOCVHelper MFC增强算法(2)
  6. eclipse 怎么新建工作空间workspace
  7. Flex外包团队—开发工具:Flex4.6新特性介绍
  8. OC12_自动释放池
  9. Linux 系统库函数coreleft 与sbrk简介
  10. C++ 表达式语句 海伦的故事
  11. thinter中combobox下拉选择控件(九)
  12. [Draft]iOS.Architecture.16.Truth-information-flow-and-clear-responsibilities-immutability
  13. ES6之Spread Operater拷贝对象
  14. 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序
  15. BCGcontrolBar(七) 添加仪表盘、动态图表显示等控件
  16. django---单表操作之展示书籍列表
  17. Android framework回想(2) sp 和 wp sp对象
  18. Android ListView滚动条配置完全解析
  19. Web站点性能拨测脚本
  20. 【Hadoop】mapreduce采用多进程与spark采用多线程比较

热门文章

  1. 自定义view实现阻尼效果的加载动画
  2. [精简版]snowing snow
  3. MacOS和iOS开发中异步调用与多线程的区别
  4. linux中 probe函数的何时调用的?
  5. SpriteKit中类似Cocos2D的CCActionSpawn并发方法GroupAction
  6. Android Multimedia框架总结(七)C++中MediaPlayer的C/S架构补充及MediaService介绍
  7. make、make clean、make install、make uninstall、make dist、make distcheck和make distclean
  8. iOS开发出错whose view is not in the window hierarchy!的解决
  9. 关于查找iOS中App路径时所要注意的一个问题
  10. 剑指Offer——腾讯+360+搜狗校招笔试题+知识点总结