C++中const的实现机制深入分析

转载 2015年07月08日 22:55:25

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的理解和使用是编程的基础,需要熟练掌握。

相关文章推荐

C++中const的实现机制深入分析

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

Android主要机制深入分析.pdf

  • 2014年01月04日 22:19
  • 3.02MB
  • 下载

Android主要机制深入分析

  • 2015年09月24日 22:31
  • 3.09MB
  • 下载

深入分析Linux内核源码-Linux管道的实现机制

7.1.1 Linux管道的实现机制 在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为: ...
  • jichl
  • jichl
  • 2013年11月12日 18:06
  • 568

深入分析_linux_spinlock_实现机制

在 x86 平台上,spinlock 主要通过处理器的 lock 指令前缀实现当某个线程的一条指令访问某个内存的时候,其他的线程的指令无法访问该内存的功能。(可见都是由处理器特性来保证!) 因此在 ...

AppWidget实现机制分析--应用更新时更新AppWidget深入分析

前不久看了博客主 stonecao 关于AppWidget的两篇文章,在读本篇博客之前,请务必先读这两篇博客: AppWidget实现机制分析–什么是桌面插件 AppWidget实现...

深入分析javaIO的工作机制.doc

  • 2012年05月23日 09:24
  • 284KB
  • 下载

深入分析JavaIO的工作机制.doc

  • 2011年12月20日 22:01
  • 391KB
  • 下载

深入分析const关键字模型

前言 const和define 宏 const const是编译期的行为 const声明占用内存 const是伪常量 const和复合类型 顶层const和底层const 概念 拷贝操作 const和...

【C学习笔记】【疑问】关于const常量的实现机制在C和C++中的不同

【疑问】关于const常量的实现机制在C和C++中的不同 【题目】 int main() {   const int a=7;   int *b=(int *)&a;   *b=21; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中const的实现机制深入分析
举报原因:
原因补充:

(最多只允许输入30个字)