程序笔记   发布时间:2022-05-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C++中const的实现机制深入分析大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问题
C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢? 本文将对这两个问题进行一些分析,简单解释const的含义以及实现机制。

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

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

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:
复制代码@H_801_17@ 代码如下:

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:
复制代码@H_801_17@ 代码如下:

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和#define的区别心得
  • c++ 尽量不要使用#define 而是用const、enum、inline替换。
  • c++ const引用与非const引用介绍
  • C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结
  • C/C++中static,inline三种关键字详细总结
  • C/C++中宏定义(#definE)
  • C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别
  • C/C++中的typedef和#define详解
  • C++中const与#define的利弊分析

大佬总结

以上是大佬教程为你收集整理的C++中const的实现机制深入分析全部内容,希望文章能够帮你解决C++中const的实现机制深入分析所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。