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

c++之static和const

一 static

static 作⽤:控制变量的存储⽅式和可⻅性,且其值可以被修改

1.1 作用1

作⽤⼀:修饰局部变量:⼀般情况下,对于局部变量在程序中是存放在栈区的,并且局部的⽣
命周期在包含语句块执⾏结束时便结束了。但是如果⽤ static 关键字修饰的话,该变量便会存
放在静态数据区,其⽣命周期会⼀直延续到整个程序执⾏结束。但是要注意的是,虽然⽤
static 对局部变量进⾏修饰之后,其⽣命周期以及存储空间发⽣了变化,但其作⽤域并没有改
变,作⽤域还是限制在其语句块

【解释】

1. 需要在函数多次调用间保留状态

普通局部变量每次进入函数都会重新初始化,离开函数就销毁;而 static 局部变量只会在第一次进入函数时初始化一次,后续调用会保留上一次的值。这让函数可以 “记住” 之前的状态。

例如,实现一个计数器,每次调用函数就加 1:

#include <stdio.h>void count() {static int num = 0;  // 仅第一次调用时初始化,后续调用不执行num++;printf("第 %d 次调用\n", num);
}int main() {count();  // 第 1 次调用count();  // 第 2 次调用count();  // 第 3 次调用return 0;
}

如果 num 是普通局部变量,每次调用都会重置为 0,无法实现计数功能;而 static 修饰后,它能在多次调用间保留状态。

2. 避免全局变量的 “污染”

如果为了保留状态而使用全局变量,会导致变量在整个程序中可见(作用域过大),可能被其他代码意外修改,造成 “全局变量污染”。

而 static 局部变量的作用域仍局限于函数内部,仅在该函数内可访问,既实现了状态保留,又保证了封装性(其他函数无法直接修改它),比全局变量更安全。

1.2 作用2

作⽤⼆:修饰全部变量:对于⼀个全局变量,它既可以在本⽂件中被访问到,也可以在同⼀个
⼯程中其它源⽂件被访问(添加 extern进⾏声明即可)。⽤ static 对全局变量进⾏修饰改变了其
作⽤域范围,由原来的整个⼯程可⻅变成了本⽂件可⻅。

1.3 作用3

作⽤三:修饰函数:⽤ static 修饰函数,情况和修饰全局变量类似,也是改变了函数的作⽤
域。

1.4 作用4

作⽤四:修饰类:如果 C++ 中对类中的某个函数⽤ static 修饰,则表示该函数属于⼀个类⽽
不是属于此类的任何特定对象;如果对类中的某个变量进⾏ static 修饰,则表示该变量以及所
有的对象所有,存储空间中只存在⼀个副本,可以通过;类和对象去调⽤。
(补充:静态⾮常量数据成员,其只能在类外定义和初始化,在类内仅是声明⽽已。)

1.5 作用5

作⽤五:类成员/类函数声明 static

二 const

含义及实现机制

2.1 作用1

const 修饰基本类型数据类型:基本数据类型,修饰符 const 可以⽤在类型说明符前,也可以
⽤在类型说明符后,其结果是⼀样的。在使⽤这些常量的时候,只要不改变这些常量的值即
可。

2.2 作用2

const 修饰指针变量和引⽤变量:如果 const 位于⼩星星的左侧,则 const 就是⽤来修饰指针
所指向的变量,即指针指向为常量;如果 const 位于⼩星星的右侧,则 const 就是修饰指针
本身,即指针本身是常量。

http://www.lryc.cn/news/624188.html

相关文章:

  • Zephyr 中 BT_GATT_SERVICE_DEFINE 使用详解
  • 面向R语言用户的Highcharts
  • 【1:1复刻R版】python版火山图函数一键出图
  • Zephyr下控制ESP32S3的GPIO口
  • 生信分析自学攻略 | R软件和Rstudio的安装
  • 抗辐照CANFD通信芯片在高安全领域国产化替代的研究
  • Android系统模块编译调试与Ninja使用指南
  • 网络通信的基本概念与设备
  • 网络常识-SSE对比Websocket
  • MYSQL-175. 组合两个表
  • STM32学习笔记13-通信协议I2CMPU6050
  • 半敏捷卫星观测调度系统的设计与实现
  • MySQL的事务日志:
  • 智能汽车领域研发,复用云原生开发范式?
  • Redis--day7--黑马点评--优惠券秒杀
  • 超市电商销售分析项目:从数据分析到业务决策
  • linux下timerfd和posix timer为什么存在较大的抖动?
  • 达梦数据库常见的重要巡检语句
  • 线程(基本概念和相关命令)
  • 重温k8s基础概念知识系列三(工作负载)
  • Linux设备模型深度解析
  • Rust Async 异步编程(五):执行器和系统 I/O
  • Python可视化工具-Bokeh:动态显示数据
  • java_spring boot 中使用 log4j2 及 自定义layout设置示例
  • 【Java后端】MyBatis-Plus 原理解析
  • 股票术语:“支撑位”
  • 链表OJ题讲解---试金石含金量
  • qt svg缺失元素, 原因是不支持 rgba
  • 测试Windows10IoT系统是否可以正常运行KingSCSDA3.8软件
  • JavaScirpt高级程序设计第三版学习查漏补缺(1)