C++关键字:static

文章目录

    • 一、static的四大用法
      • 1.静态局部变量
      • 2.静态全局变量
      • 3.静态函数
      • 4.类中的 静态成员变量、静态成员函数

一、static的四大用法

1.静态局部变量

延长局部变量的生命周期

1.与普通的局部变量不同,局部静态变量在函数调用结束之后,不会被销毁,而是保持其值与存在。如果想重复使用一个变量,又不想将其声明为全局变量(不想让其他函数使用该变量),就可以将其声明为局部静态变量。

生命周期延长了,不销毁。但作用域仍然是局部的,仅在该函数内。

2.静态变量的作用(使用场景):
统计函数的调用次数、记录某个状态的变化


3.静态局部变量、普通全局变量、普通局部变量的对比:
生命周期:局部静态变量、普通全局变量 在整个程序的执行过程中都存在
存储位置:局部静态变量、普通全局变量 都存储在 数据段(静态存储区)(存放全局变量、静态变量),并不像普通局部变量那样存储在栈或堆上。
作用域:局部静态变量只在声明它的函数内部可以被使用,全局变量可以被任何函数所使用



例如:在函数中使用 static int count时。下一次调用函数时,count不仅不会重新创建,而且其值还会保持不变。因为static count是存储在静态区(数据段),而不是栈区。

#include <iostream>
using namespace std;

void countCalls(){
//    int count = 0;
    static int count = 0;
    count++;
    cout << "调用次数:" << count << endl;
}

int main() {
    int n;
    cin >> n;
    for(int i = 0; i < n; ++i){
        countCalls();
    }
    return 0;
}



2.静态全局变量

限制全局变量的作用域,只能在该文件内使用。

使用static声明的全局变量,称为全局静态变量。在声明它的文件之外是不可见的。准确的说,是从定义位置开始到该文件结尾。只可以使其在声明所在的文件内可见,不能跨文件调用。这样可以避免与其他文件中相同名称的变量产生命名冲突。即使使用extern关键字也不行。

未经初始化的静态全局变量会被自动初始化为0。



3.静态函数

限制函数的作用域,也只能在该文件内使用该函数。

使用static修饰的函数称为静态函数,这种函数只能在声明所在的文件内部调用,无法被其他文件直接调用。不能跨文件调用。

使用场景:将一些辅助函数、实用函数限定在特定文件内

#include <iostream>
using namespace std;

static int calculateSum(int a,int b){
	return a + b;
}

在这里插入图片描述
在这里插入图片描述



4.类中的 静态成员变量、静态成员函数

静态成员可以实现同一个类中多个对象之间的数据共享。静态成员可以理解为类中所有对象共享的成员,而不是某个对象的成员。静态数据成员只存储一处,供所有对象共用。

静态成员函数,也是 类的静态成员。因此对其引用也不需要对象名。

static修饰的成员属于类而不属于某个具体的对象。

成员函数,既可以访问成员变量,也可以访问静态变量。
静态函数,只能访问静态变量

static是全局独一份的。

静态的属于类,成员的属于对象。(先有类,后有对象。先初始化静态的,再初始化成员的)

静态成员变量,在类内声明,但必须在类外初始化。

在这里插入图片描述


#include <iostream>
using namespace std;

class Test{
public:
    int a = 1;
    static int b;
    Test(){
        b++;
    }
    int print_b(){ return b;}
    //static int print_a(){return a;}  //静态成员函数,只能调用静态成员变量
};

int Test::b = 2;

int main() {
    Test T1;
    cout << T1.print_b() << endl;
    Test T2[6]; //T2是个数组,有6个对象,调用6次构造函数
    Test T3;
    cout << T3.print_b() << endl;
    cout << Test::b << endl;  //静态成员变量,可以不需要对象,直接通过类名调用
    return 0;
}

实例:类创建的对象
方法:函数
属性:指 成员变量
构造器:指 构造函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/469460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国银联订单支付产品实施指南(2022.A 版)

为落实总行提出以银行账户为基础&#xff0c;全面提升对小微企业、民营企业的支付结算服务能力和水平的总体思路要求&#xff0c;践行支付为民&#xff0c;银联提出建设订单支付产品&#xff0c;通过深度融合企业线上线下支付场景&#xff0c;充分赋能商业银行B2B业务支付结算&…

数据结构奇妙旅程之红黑树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

“团团活力圈”--“书香润童心 阅读伴成长”青少年读书分享活动

书籍是人类进步的阶梯&#xff0c;读书能够陶冶人的情操、开阔眼界&#xff0c;同时&#xff0c;通过读书&#xff0c;能够帮助人们增长知识&#xff0c;培养正确的人生观、价值观。为了帮助青少年多读书&#xff0c;感受读书的乐趣&#xff0c;3月17日&#xff0c;在共青团中央…

【代码】YOLOv8标注信息验证

此代码的功能是标注信息验证&#xff0c;将原图和YOLOv8标注文件&#xff08;txt&#xff09;放在同一个文件夹中&#xff0c;作为输入文件夹 程序将标注的信息还原到原图中&#xff0c;并将原图和标注后的图像一同保存&#xff0c;以便查看 两个draw_labels函数&#xff0c;分…

Ubuntu Desktop - Desktop

Ubuntu Desktop - Desktop 1. Amazon2. Ubuntu Software3. Desktop4. 系统桌面快捷方式5. 用户桌面快捷方式References 1. Amazon Amazon -> Unlock from Launcher 2. Ubuntu Software Installed -> Games -> Remove 3. Desktop /home/strong/Desktop 4. 系统桌面…

Java项目:65 ssm社区文化宣传网站+jsp

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本选题则旨在通过标签分类管理等方式&#xff0c; 实现管理员&#xff1b;个人中心、用户管理、社区新闻管理、社区公告管理、社区活动管理、…

React——开发者工具

浏览器插件&#xff1a;谷歌浏览器插件react-devtools 方式1&#xff1a;chrome应用商店添加 方式2&#xff1a;下载安装包放在浏览器上

32串口学习

基于之前的GPIO等工程&#xff0c;后面的上手难度就简单多了&#xff0c;主要是相关寄存器的设置。 void USART1_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* config USART1 clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph…

可视化图表:雷达图的全面介绍,一篇就够了。

一、什么是雷达图 雷达图&#xff08;Radar Chart&#xff09;是一种可视化图表&#xff0c;也被称为蛛网图、星形图或极坐标图。它以一个中心点为起点&#xff0c;从中心点向外延伸出多条射线&#xff0c;每条射线代表一个特定的变量或指标。每条射线上的点或线段表示该变量在…

Linux常用命令之搜索查找类

1.1find查找文件或目录 1&#xff09;基本语法 find [搜索范围] [ 选项] find -name&#xff1a;按照名字查找 find -user&#xff1a;按用户相关查找 find -size&#xff1a;按照文件大小查找 1.2locate快速定位文件路径 经验技巧&#xff1a;由于locate指令基于数据库进行…

Ubuntu上搭建TFTP服务

Ubuntu上搭建TFTP服务 TFTP服务简介搭建TFTP服务安装TFTP服务修改配置文件 重启服务 TFTP服务简介 TFTP是一个基于UDP协议实现的用于在客户机和服务器之间进行简单文件传输的协议&#xff0c;适用于开销不大、不复杂的应用场合。TFTP协议专门为小文件传输而设计&#xff0c;只…

信息学奥赛之C++ cstdlib – 概览

什么是 C cstdlib&#xff1f; C 标准库头文件 (cstdlib in C) 是 C 程序员使用最广泛的库头文件。即&#xff1a;standard librarian。它定义了一系列函数和宏&#xff0c;以实现跨团队、跨平台的高效且具有卓越表现的标准化 C 代码。 C 是一种广受欢迎的程序语言&#xff0c…

总结

文章目录 1. GateWay&#xff1a;100102. Docker3. ES&#xff1a;海量数据的存储、搜索、计算3.1 数据搜索3.2 数据同步 4. 微服务保护&#xff1a;Sentinel4. 分布式事务&#xff1a;&#xff08;二阶段提交&#xff09;5. Redis6. 多级缓存 1. GateWay&#xff1a;10010 2. …

【工具】Mermaid + 大模型画流程图

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 引入使用画TCP三次握手了解历史人物 总结 引入 最近看面试文章关于TCP三次握手和…

【数据结构】链表力扣刷题详解

前言 题目链接 移除链表元素 链表的中间结点 反转链表 分割链表 环形链表的约瑟夫问题 ​ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 移除链表元素 题述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请…

基于python的在线学习与推荐系统

技术&#xff1a;pythonmysqlvue 一、系统背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大…

大模型知识库

一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 1. 下载Langchain-chatchat git clone https://github.com/chatchat-space/Langchain-Chatchat/ 2. 下载大模型和embe…

从零开始学习在VUE3中使用canvas(一):实现一个基础的canvas画布

一、步骤 1.写一个canvas元素 2.获取虚拟dom 3.获取绘制环境 4.绘制想要的效果 5.在挂载后执行 二、代码 <template><div class"canvasPage"><!-- 写一个canvas标签 --><canvas class"main" ref"main"></canv…

StringTable(字符串常量池)

目录 String的基本特性 String的内存分配 字符串拼接操作 intern()的使用 String的基本特性 String&#xff1a;字符串&#xff0c;使用一对""引起来表示 String声明为final的&#xff0c;不可被继承 String实现了Serializable接口&#xff1a;表示字符串是支持…

Docker可视化容器管理工具(Portainer)

一、简介 Portainer 是 Docker 的轻量级&#xff0c;跨平台和开源管理 UI。Portainer 提供了 Docker 的详细概述&#xff0c;并允许您通过基于 Web 的简单仪表板管理容器&#xff0c;镜像&#xff0c;网络和卷。支持 GNU/Linux&#xff0c;Windows 和 Mac。 官网地址&#xf…