4.static关键字和const关键字的作用【高频】

news/2025/2/26 6:42:33
1. static 关键字

用static可以声明 静态变量,它存储在静态存储区中,它的生命周期 在整个程序运行期间 都存在。

  • 静态局部变量:

    • 参考之前

  • 静态全局变量:

    • 参考之前

  • 类中的静态成员

    在类中,被static声明的成员称为静态成员,包括 静态成员变量 和 静态成员函数:

    • 静态成员变量:

      • 该变量 属于这个类本身 而不是 某一个对象,所有的对象 共享这个变量

      • 在类内声明,在类外初始化

      • 和静态局部变量不一样,它的值是可以被多次赋值的

    • 静态成员函数:

      • 同理,表示所有对象 共享这个函数

      • 它内部可使用的变量也有限制:没有this指针,只能访问 静态成员变量

      • 静态成员函数的调用可以不通过创建 类的实例,而是直接通过 类名 调用

      • 它不能被声明为const、volatile和虚函数

  • 多线程

    • static变量 如果被 多线程 访问,需要特别注意 线程安全 问题

img

img

2. const关键字

  • 用const可以声明 常量变量,使变量不能被修改,且在定义时必须初始化

  • const形参可以接收const和非const实参

  • 类内:

    • const修饰成员变量:不能在类外初始化,必须在构造函数初始化列表中初始化。

    • const修饰成员函数:不能改变变量的值(除非用mutable修饰过)

    • const修饰对象:const对象只能调用const成员函数;非const对象都可以调用

  • 可以用于定义 常量指针指针常量

    • 常量指针 表示这个指针所指向的是一个常量。我们不能通过这个指针 来修改它所指向的值,但是指针本身的值,也就是 它所指向的地址 是可以改变的(const在*p之外)

      #include "stdio.h"
      void main(void)
      {
      	int const *p=NULL;//常量指针 //等效于 const int*p=NULL;
      	int a=10;
      	p=&a;//进行地址赋值
      	printf("%#x--%#x\r\n",p,&a);//打印地址值
      	printf("%d--%d\r\n",a,*p);//打印数据值
      } 
    • 指针常量 是指 指针本身是常量,也就是说 一旦被初始化,它所指向的地址 就不可更改了。但是 它所指向的数据是可以被修改的(const在*P之间)

      #include <stdio.h>
      int main(void)
      {
      	int a=10;
      	int *const p=&a;//初始化时赋值a的地址 //即int *(const p)=&a;
      	*p=20;
      	printf("%#x--%#x\r\n",p,&a);
      	printf("%d--%d\r\n",a,*p);
      }
    • 也可以同时使用 两个const关键字 来修饰 指针,使得它既是 常量指针,又是 指针常量,也就是 它所指向的数据 不能被修改,同时 它本身的值 也不能被修改

  • const也具有隐蔽性,被const修饰的变量不能被其他文件使用(链接都是内部的,所以其他文件也可以定义相同的名字的变量;而且头文件也可以包含const变量,但不能包含全局变量)

3. 有时候 static 和 const 可以组合使用,如 static const 变量,表示一个静态的常量

总之,static 用于 创建类的静态成员,const 用于 定义常量


http://www.niftyadmin.cn/n/5868240.html

相关文章

React 源码揭秘 | hooks原理

上篇我们说了updateQueue的实现原理&#xff0c;这篇我们说一下hooks&#xff0c; fiberHooks实现可以在react-reconciler/fiberHooks.ts 找到。 老生常谈的问题&#xff0c;为什么hooks有顺序&#xff0c;hook函数怎么知道你在哪运行的hooks&#xff1f; 下面我们逐一讨论。…

kafka队列堆积的常见解决

1. 检查生产者是否正常工作 如果生产者速度太慢或者不稳定&#xff0c;可以通过增加生产者吞吐量来解决。 解决方案&#xff1a; 提高生产者的吞吐量&#xff1a;可以通过调整生产者配置来增加吞吐量。 设置生产者 acks 参数为 1 或 0&#xff08;如果不需要严格的消息确认&…

前端项目配置 Nginx 全攻略

在前端开发中&#xff0c;项目开发完成后&#xff0c;如何高效、稳定地将其部署到生产环境是至关重要的一步。Nginx 作为一款轻量级、高性能的 Web 服务器和反向代理服务器&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;成为了前端项目部署的首选方案。本文将详细介绍在…

Flutter系列教程之(4)——自定义Widget控件及相关知识

目录 StatelessWidget与StatefulWidget简介 StatelessWidget 创建Widget 使用 StatefulWidget 简单说明 改变页面数据 使用补充 1.传递参数 2.外层Widget改变当前Widget StatelessWidget与StatefulWidget简介 我们需要创建我们自定义的 Widget 控件&#xff0c;只需要…

动态表头导出EasyExcel

在 Spring Boot 中结合 EasyExcel 实现动态表头导出&#xff08;无实体类&#xff0c;表头和字段&#xff08;前端传表名&#xff0c;字段值动态查询&#xff0c;返回List<Map<String,Object>>&#xff09;由前端传递&#xff09;可以通过以下步骤实现。以下是完整…

Log | Hugo+PaperMod+Github创建自己的博客网站

0. 友情提示 以上内容是我根据我的博客构建内容中总结&#xff0c;并不是在构建过程中记录的&#xff0c;或许有错误之处&#xff0c;若存在问题&#xff0c;欢迎大家指出&#xff01; 欢迎大家关注我的个人博客网站&#xff1a;YHs Log 1. 引言 Lilian Wengs Log: LilLog 在…

MacOS 终端选型

MacOS终端工具选型与技术栈建议 一、核心工具对比矩阵 工具名称最新版本核心优势适用场景推荐指数引用来源iTerm25.3分屏/自动补全/多语言支持/全局搜索全栈开发/服务器运维⭐⭐⭐⭐⭐19Warp1.4AI智能补全/块编辑/现代UI/跨平台协作新手友好/团队协作⭐⭐⭐⭐39Tabby2.0多协议…

Spring MVC 的执行流程解析:从用户请求到响应返回

Spring MVC 是一种基于 Model-View-Controller 设计模式的 Web 框架&#xff0c;用于处理用户请求、执行相应的业务逻辑并返回响应。它广泛应用于 Java Web 开发&#xff0c;提供了灵活的架构和丰富的功能。 本文将详细介绍 Spring MVC 的执行流程&#xff0c;帮助你理解它是如…