当前位置: 首页 > news >正文

关于const、指针和引用【C++复习】

指针+const+引用 的用法

1、const和指针的关系

const是修饰变量的,通常修饰的是它的右部,比如const intp=&a;const修饰p,说明p的


指向可以发生改变,而不能通过*p去改变指向的变量的值,const必须初始化。
const引用可以引用变量也可以引用常量,也可以引用字面常量,而普通引用则不能引用字面常量。

而指针,就是存放地址的变量,可以理解为就是地址,如int *p=a;则在p的内存空间中就存放的是a的内存空间的地址。

1.指向常量的指针(指针指向的对象是const)

constinta=29;constint*p1=&a;//这种情况,可以改变p1的指向,但是不通过p1改变a的值;intconst*p2=&a;//与上面相同,也不可以通过p2改变a的值

2.常量指针(指针的指向不能变)

int * const p3=&a;
这种情况下,不能改变p3的指向,但是可以通过p3改变a的值。

3.const int * const p4=&a;

此时,p4是一个指向常量对象的常量指针。此时,既不能改变p4的指向,也不能改变p4的值。

区分编译器是c还是c++:依靠宏__cplusplus

去常性强转:

constinta=10;intb=0;int*p=(int*)&a;//okint*s=const_cast<int*>(&a);//error 能力不能扩展*p=100;b=a;

2、const与引用的关系

引用的本质:

语法层面:引用就是变量的别名,安全,是指针的语法糖

从汇编层面来看,引用实际上就是const的指针:

不允许返回局部变量的引用
但是,那些变量可以在函数里用&返回(此变量的生存期不受函数影响的):static 、全局变量 、以引用传进来的

常量的引用

Constinta=90;Constint&s=a;

对一个常量起了一个别名,将引用和一个常量对象绑定;
也可以允许一个常量引用绑定一个非常量的对象、字面值或表达式:

Int a=28;Constint&s2=a;Constint&s3=490;Constint&s4=s2+s3;

一般用法:

inta=10,b=20;constint*s=&a;//这句限制了s是个常量指针,指向不饿能改变但是值可以改int*&p1=s;//error 会通过p1改变s的指向,不允许constint*&p2=s;//errorint*const&p3=s;//okconstint*const&p4=s;//ok

3、const和static的区别

二者都是关键字,都可以用于修饰变量和函数,const关注不可修改,static关注生命周期和作用域。

3.1 const用法:

1)定义常量

constintMAX_LEN=10;替代了宏定义,更安全了,有了类型检查和作用域

2) 修饰函数参数和函数返回值 —— 目的是防修改

voidprint(const&name){cout<<name<<endl;}

3)修饰指针(左定值右定向)
常量指针(const T*) ,const修饰指针类型,此时可以修改指针的指向,不能修改值
指针常量(T* const),此时可以修改值,但不能修改指针的指向

4)修饰引用 —— 不能通过引用来修改值

5)修饰成员函数

this指针不属于对象,const修饰某个成员函数,实际上就是隐藏了this指针,也就无法修改非静态成员变量的值了

3.2 static

static在C和C++中都存在使用,重点在于其修饰的内容在生命周期和作用域上的变化

在C中,static可以修饰:

  • 静态变量对于基本数据类型,默认初始化0

  • 静态全局变量:
    生命周期一直到程序结束,跟全局变量相比不变;但作用域从整个程序(extern)到限定在当前文件了

  • 静态局部变量:相较于局部变量,延长了生命周期,直到程序结束;作用域不变,依旧在函数内部

  • 静态函数:相较于全局函数,作用域从整个程序(extern)到限定在当前文件

在C++中,static修饰:

  • 静态成员变量:属于类,与所有对象所共享,存储在全局数据区;需要在类的外部定义,类内声明;访问权限由类的public、protected、private来决定
  • 静态成员函数:属于类,类::函数()的方式访问,函数中只能访问静态成员变量和静态成员函数;访问权限由类的public、protected、private来决定
http://www.gsyq.cn/news/1633010.html

相关文章:

  • CAPL脚本函数不能返回数组的替代方案
  • 三步搞定跨语言障碍:STranslate翻译工具完全指南
  • Springboot整合MybatisPlus【一】
  • 赞赞赞!融云收获行业媒体「组团打 Call」
  • Elm-platform项目管理指南:使用elm-package管理依赖和发布包
  • STM32F107VC与A89307的BLDC电机FOC控制方案详解
  • 3个平台限制下的架构突破:猫抓项目的技术演进启示
  • 10分钟上手NoDock:Node.js开发者必备的Docker容器化解决方案
  • Scarab:让空洞骑士模组管理变得直观简单的跨平台解决方案
  • 酷睿Ultra X9 388H架构解析与性能实测
  • YOLO26实战:从环境搭建到自定义训练的全流程避坑指南
  • gprMax devel分支中的重构:从过程式仿真程序到分层科学计算框架
  • 如何高效提取Wallpaper Engine资源:专业逆向工具的完整指南
  • Slash实战案例:从代码示例到真实项目,教你如何优雅实现复杂富文本界面
  • 省时省力!德国宣誓翻译驾照认证件去哪办?24小时出件全攻略
  • MZmine 3终极指南:如何免费快速处理质谱数据的完整解决方案
  • DocStrap社区贡献指南:如何参与项目开发与问题修复
  • cdc同步工具
  • Tabled API集成指南:如何将表格提取功能嵌入到你的应用中
  • AI大模型驱动自动化测试:从原理到落地的全链路实践指南
  • 【Java课程设计/毕业设计】基于 SpringBoot 的数字科技风险报告管理系统的设计与实现智能化科技风险报告编制与溯源管理系统【附源码、数据库、万字文档】
  • Micro Journal Rev.7电子墨水屏版本:护眼写作的革命性突破
  • 融云「北极星」数据监控平台:数据可视通晓全局,精准分析定位问题
  • Instatic媒体批量上传:拖放功能与进度监控的终极指南
  • 陶瓷基板在PCB设计中的核心价值与应用解析
  • postcss-write-svg与构建工具集成:Gulp/Grunt/PostCSS配置教程
  • Windows Research Kernel (WRK) 本地过程调用(LPC):Windows进程间通信的内核实现
  • 3个颠覆性方法解决Iwara视频下载难题:让你的收藏效率提升500%
  • Mermaid Live Editor:告别拖拽,用代码思维重塑图表创作体验
  • C语言内存编址