Chinaunix首页 | 论坛 | 博客
  • 博客访问: 912563
  • 博文数量: 299
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-21 10:07
个人简介

Linux后台服务器编程。

文章分类

全部博文(299)

文章存档

2015年(2)

2014年(297)

分类: C/C++

2014-09-09 22:50:56

问题


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

问题分析


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

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

C语言const示例:
  1. const int i=10;  
  2.   
  3. int *p=(int *)(&i);  
  4.   
  5. *p=20;  
  6.   
  7. printf("i=%d   *p=%d   \n",i,*p);  

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

C++语言const示例1:
  1. const int i=10;  
  2.   
  3. int *p=const_cast<int *>(&i);  
  4.   
  5. *p=20;  
  6.   
  7. cout<<"i="<"   *p="<<*p<

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

C++语言const示例2:
  1. struct test{  
  2.     int j;  
  3.     char tmp;  
  4.     test()  
  5.     {  
  6.         j=30;  
  7.         tmp='a';  
  8.     }  
  9. };  
  10.   
  11. int main(int argc, char* argv[])  
  12. {  
  13.   
  14.     const struct test t1;  
  15.     int *q=(int *)(&t1.j);  
  16.     *q=40;  
  17.     cout<<"j="<"   *q="<<*q<
  18.     return 0;  
  19. }  

输出结果是 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<

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


小结


C语言与C++有很多的区别与联系,const只是其中一个方面,对于const的理解和使用是编程的基础,需要熟练掌握。
阅读(1129) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~