static关键字的作用

news2025/1/16 3:56:45

目录

C语言中static关键字的作用

1.static关键字修饰局部变量

2.static关键字修饰全局变量

3.static关键字修饰函数

在C++中static关键的作用

1.静态成员变量

2.静态成员函数


C语言中static关键字的作用

1.static关键字修饰局部变量

概念: static修饰局部变量就使之成为静态局部变量。

作用域: 静态局部变量的作用域并未发生变化,在其所在的局部范围,也就是其所定义的代码块内部。

生存期: 静态局部变量实际上是特殊的全局变量,它们位于相同的内存区域,内存分为栈区,堆区,静态存储区。静态局部变量和全局变量都位于静态存储区,因此静态局部变量的生存期与全局变量一样是全局的,随程序启动而生,随程序结束而消亡。

特点: 静态局部变量的初始化只会在第一次进入这个函数时进行初始化,当离开函数的时候,静态局部变量会继续存在并保持其值,以后进入函数时会保持上次离开时的值。

2.static关键字修饰全局变量

因为全局变量具有外部连接属性,外部任意一个源文件想要使用其他源文件中的全局变量,只需要先使用extern关键字进行声明,然后就可以使用,也就是说某个源文件的全局变量可以在整个项目中被任意的一个源文件使用,所以全局变量的作用域是整个工程。当一个全局变量被static所修饰的时候,它就称为了静态全局变量,静态全局变量具有内部连接属性,使得这个静态全局变量只能在自己所在的编译单元中被使用,而不能被其它编译单元所使用,否则会出现链接性错误。

static修饰变量时,如果变量没有被初始化会被自动初始化为0

3.static关键字修饰函数

函数也是具有外部连接属性的,编译器每次编译只处理一个编译单元,当某个编译单元需要使用其他编译单元中的函数,只需要声明该函数(或者包含该函数声明所在的头文件)然后就可以使用,当一个函数被static所修饰的时候,这个函数的外部连接属性就变成了内部连接属性,也就成为了静态函数,使得这个静态函数只能在自己所在的编译单元中被使用,而不能被其它编译单元所使用,否则会出现链接性错误。

通常我们在头文件中声明一个函数,然后在源文件中去定义该函数,在定义某函数时需要将某一段代码封装成为另一个函数以达到复用的目的,这段代码所封装成的函数只是为了定义那个函数所使用,不会在其它源文件中使用,所以将其声明为static。

在C++中static关键的作用

static关键字修饰类中成员使之成为静态成员,静态成员的特点如下:

  • 静态成员也是类的成员,受public、protected、private 访问限定符的限制。
  • 静态成员为所有类对象所共享,不属于某个具体对象,它是属于类的,只有一份内存,类静态成员可用类名::静态成员或者对象.静态成员来访问,类名访问,肯定是从类外访问,那么类外访问的话,就要求静态成员是公有属性,可以用类名访问这一点也说明:静态成员变量肯定不是属于对象的,如果是属于对象,那么就不能用类名访问了。

静态成员包括静态成员变量和静态成员函数,static关键字修饰成员变量使之成为静态成员变量,static关键字修饰成员函数使之成为静态成员函数。

1.静态成员变量

特性:

  • 在对象的构造函数中不能对静态成员变量进行初始化,因为静态成员变量不属于单个对象,不需要对象去初始化。静态成员变量在类中加static声明,在类外进行初始化定义,初始化定义时不添加static关键字。若未对静态成员变量进行初始化操作,编译器会自动将其初始化为0。
  • 静态成员变量只能初始化,不能赋值
  • 静态成员变量可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。
  • 静态成员变量存储在静态存储区,和静态局部变量和全局变量一样,它的生存期是全局的,是在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态成员变量,即使不定义对象,也会为静态成员变量分配空间。

如图,如果在类中进行初始化定义,编译器就会报错

改成如下,类中声明,类外定义就没有问题了

如果给静态成员变量赋值,编译器就会报错

2.静态成员函数

定义方式:

  1. 类中声明,类外定义
  2. 类中定义

 

class ClassName
{
public:
    static Type fun(){}//在类中定义
    static Type fun2();//类中声明
};
Type ClassName::fun2(){}//在类外定义

在类外定义的时候不需要再加上static

特性:

静态成员函数没有隐藏的this指针,不能访问任何非静态成员。

没有隐藏的this指针是因为可以通过类名直接去访问函数,那么过程中间不存在对象,this指针就没有对象去指向了,为了避免这种情况的发生,索性就静态函数中就不要this指针了,如果通过对象去调用静态成员函数,虽然可以正确调到,但是this指针也没了。

不能访问任何非静态成员。原因之一是因为不存在this指针,因此你无法在静态成员函数中通过.操作符和->操作符来访问属于某个具体对象的非静态成员。静态成员函数只能访问静态成员。普通成员函数可以访问普通成员,也可以访问静态成员。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这才是2023年csdn最系统的网络安全学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…

2. 认识O(logN)的排序

1. 递归 递归arr[L…R]范围上求最大值 流程分析如下: java代码: package paixu.class01;public class Code08_GetMax {public static void main(String[] args) {int[] arr {3,2,5,6,7,4};System.out.println(getMax(arr));}public static int getMax(int[] arr) {return p…

浅谈非类型模板参数、模板的特化

非类型模板参数 1.模板参数分类类型形参与非类型形参。 2.类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。类型参数也可以给缺省值 3.非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函…

FARO RevEng Software 22.3.9 Crack

FARO RevEng Software 22.3.9 用于反向工程的三维点云捕捉和网格生成 先进的 FARO RevEng 软件平台能为用户带来全面的数字设计体验。该反向工程软件有助于利用三维点云创建和编辑高质量的网格和 CAD 表面,以实现反向工程工作流程。然后,工业设计师可以利…

Zookeeper 集群安装

Zookeeper 集群 主机 IP SoftWare Port OS Myidnode1 192.168.230.128 apache-zookeeper-3.7.1 2181 Centos 7 1 node2 192.168.230.129 apache-zookeeper-3.7.1 2181 Centos 7 2 node3 192.168.230.130 apache-zookeeper-3.7.1 2181 Centos 7 31. 下载 Apache Downloads 下…

2022简单一年

牙齿软件决定开发的时间是2021年底, 老板说2022年任务是要开发牙齿咬合力的软件, 功能主要借鉴美国的一款软件,老板给了我一份软件的说明书, 包含了软件的所有功能。 看到软件第一感觉是, 做的确实是牛逼, 并且各…

【十 二】Netty 文件传输

概念介绍 文件是最常见的数据源之一,程序经常需要在文件中读取数据,也要将数据保存在文件中,进行持久化。 文件是计算机中一种基本的数据存储形式。即使计算机关机,文件的数据还是存在的,但是内存的数据就会丢失。 相…

联合证券|五定增项目同日被否 保荐机构该不该“背锅”?

一天之内5家上市公司定增一起被拒,这一音讯瞬间引发商场重视。 1月11日,浙江世宝、铭普光磁、胜华新材、日辰股份、振华科技等5家上市公司一起公告称,定增不被证监会受理,理由均是证监会以为请求资料不符合法定方式。 投行业界人…

18.Isaac教程--坐标系

坐标系 本节介绍相机、网格/矩阵/图像和机器人坐标系。 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录坐标系网格像素中心网格/矩阵/图像坐标系相机坐标系机器人坐标系网格像素中心 存储网格 GGG 上的值,使得网格单元将值…

Crack:CAD Exchanger GUI/CAD Exchanger Lab 不是SDK

CAD Exchanger GUI/CAD Exchanger Lab 用于查看、转换和分析 CAD、BIM 和 3D 数据 在 Windows、Mac 和 Linux 上加载和转换模型,而无需处理昂贵的 CAD 系统。 使用 CATIA、SOLIDWORKS、Creo、STEP、JT、IFC 和更多格式。 非常适合您的 3D 数据工作流程 连接不同的软…

多频电磁仪在2018年杭州电磁大会的报告(ICEEG)

本篇是对多频电磁方法,应用的解读。 本汇报讲述了EMI传感器的基本情况,以及用手持多频电磁仪进行实际探测应用的例子。 什么是电磁感应?用发射装置(TX)激发谐波,产生一次场(Primary field),地下导体目标会相应产生涡流电磁场,产生二次场,被接收装置(RX)探测到。 …

超参数、划分数据集、偏差与方差、正则化

目录1.超参数(hyperparameters)参数(Parameters):,,,,,...超参数:能够控制参数W,b的参数,是在开始学习之前设置的参数。比如:学习率、梯度下降循环的数量#iterations、隐…

力扣sql基础篇(七)

力扣sql基础篇(七) 1 统计各专业学生人数 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 想要没有学生的部门也保存,就得以部门表作为主表 #字母表顺序就是升序 SELECT d.dept_name,IFNULL(s1.number,0) student_number FROM Department d LEFT …

2022. 12 青少年机器人技术等级考试理论综合试卷(二级)

2022.年12月青少年机器人技术等级考试理论综合试卷(二级) 一、 单选题(共 30 题, 共 60 分) 1.“机器人三原则” 是由谁提出的? ( ) A.美国人艾萨克 阿西莫夫 B.日本人森昌弘 C.美国人乔治 德沃尔 D.中国人…

谈谈 MongoDB 中连接池、索引、事务等问题

大家好,三分钟你将学会: MongoDB连接池的使用方式与常用参数查询五步走,能活九十九?MongoDB索引与MySQL索引有何异同?MongoDB事务与ACID什么是聚合框架?在最开始接触MongoDB的时候,是通过 Mong…

H3C V7MSR路由器定时限速的典型应用配置

某公司希望在上班时间对员工进行每IP限速,其他时间不限制。 1.主要配置如下: #创建关闭接口g0/1的限速功能 scheduler job close-car-g0/1 command 1 system-view command 2 interface g0/1 command 3 undo qos car inbound carl 1 #创建开启接口g0…

什么是CISP-ICSSE?到底该不该考?

CISP-ICSSE注册信息安全专业人员-工业控制系统安全工程师,英文为 Certified Information Security Professional-ICS Security Engineer,简称 CISP-ICSSE。 持证人员可以从事信息安全技术领域工业控制系统安全方向的工作,具备制定工 控安全威…

74. 序列模型

1. 序列数据 实际中很多数据是有时序结构的例如,电影的评价随时间变化而变化 拿奖后评分上升,直到奖项被忘记看了很多好电影后,人们的期望变高季节性:贺岁片、暑期档导演、演员的负面报道导致评分变低 2. 序列数据-更多例子 音…

【文件操作】C语言

目录1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭4. 文件的顺序读写5. 文件的随机读写5.1 fseek5.2 ftell5.3 rewind6. 文本文件和二进制文件7. 文件读取结束的判定8. 文件缓冲区1. 为什么使用文件 …

NodeMCU esp8266的网络连入网络的模式方式即程序实例

接入WIFI模式 参考:http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/internet-basics/link-layer/ 模式1 – 无线终端模式(Wireless Station) 简单说就是把这个开发板做为终端连入WiFi 程序实例 需要注意:端口号…