《C++深度剖析》学习日志九——深入探究const和引用

 这篇日志是重头戏,const可以算是一般重要,但是引用关系到指针,就是非常重要了,大家都知道,C++最赖以生存的就是指针,好,接下来我们来一起探讨const和引用。

const

 首先,我们都知道在C语言中,const修饰的是只读变量,而在C++中,const修饰的是常量,并且直接把常量放入符号表中待用,但事实真的是这样吗?究竟const什么时候为只读变量,什么时候为常量呢?让我们来分析下面代码。

#include <stdio.h>

int main()
{
    const int x = 1;//进入符号表
    const int& rx = x;//取x 的地址给rx
    
    int& nrx = const_cast<int&>(rx);去掉rx的只读属性,并且使rx和nrx同地址
    
    nrx = 5;//那么,x为1,rx为5,nrx为5,地址都一样
    
    printf("x = %d\n",x);
    printf("rx = %d\n",rx);
    printf("nrx = %d\n",nrx);
    printf("&x = %p\n",&x);
    printf("&rx = %p\n",&rx);
    printf("&nrx = %p\n",&nrx);

    return 0;
}

看来我们的分析是正确的,那么他的评判标准是什么呢?

 *const常量的判别标准

 ——只有用字面量(数字,字符等)初始化的const常量才会进入符号表

 ——使用其他变量初始化的const常量仍然是只读变量

 ——被volatile修饰的const常量不会进入符号表

   编译期间不能直接确定初始值的const标识符,都被作为只读变量处理

说完前两条,那么现在该验证第三条。

#include <stdio.h>

int main()
{   
    volatile const int y = 2;//不会进入符号表,只读变量
    int* p = const_cast<int*>(&y);//取y的地址给p
    
    *p = 6;//内存地址里的值改变,y即改变
    
    printf("y = %d\n",y);
    printf("p = %p\n",p);
    return 0;
}



 *const引用的类型与初始化变量类型

 ——相同:初始化变量成为只读变量

 ——不同:生成一个新的只读变量

#include <stdio.h>

int main()
{   
    volatile const int y = 2;
    int* p = const_cast<int*>(&y);
    
    *p = 6;
    
    printf("y = %d\n",y);
    printf("p = %p\n",p);
    
    const int z = y;//是否为常量的标准是在编译期间,能否确定变量的值,y是变量,不是定值常量,所以生成只读变量
    
    p = const_cast<int*>(&z);//去掉z的只读属性,并且z的地址给p
    
    *p = 7;//z=7
    
    printf("z = %d\n",z);//
    printf("p = %p\n",p);
    
    char c = 'c';
    char& rc = c;
    const int& nrc = c;//const的初始化变量类型不同,生成一个新的只读变量nrc
    
    rc = 'a';
    
    printf("c = %c\n",c);
    printf("rc = %c\n",rc);   
    printf("nrc = %c\n",nrc); 
         
    return 0;
}

引用

 引用和指针有什么关系呢,如何理解“引用的本质就是指针常量”?


 引用和指针本身没有关系,引用是变量的名字,而指针是变量,指向地址。但是在C++编译器的内部,是使用指针常量来实现引用,所以引用在定义时必须初始化。

 在编程时,可以站在使用角度上看待引用,但在调试时,必须站在编译器的角度上,看待引用。

问:下面代码会报错吗?

int a = 1;
int b = 2;
int* pc = new int(3);
int& array[]={a,b,*pc};
 站在使用者的角度看,没有问题,但是编译器所默认的数组元素的内存地址必须相邻,很显然,pc和b不一定相邻。 所以在C++里不支持引用数组。

小结

 指针是变量,引用是变量别名,const引用能生成新的只读变量,在C++内部,指针常量实现“引用”,便宜是不能确定初

始值的const都是只读变量。

以上资料均来自狄泰,群号:199546072,志同道合的朋友可以加我:
 qq:335366243
 微信:zhong_335366243

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值