【关键字】static 使用总结_c++ static关键字-程序员宅基地

技术标签: c++  c语言  关键字  

一. static 关键字概述

static 关键字的作用体现在以下两个方面

  • 实现数据共享,节约内存
  • 保持封装性,避免命名冲突

static 可以作用的对象

  • C语言:局部变量、全局变量、函数
  • C++:类的成员变量和成员函数

static 关键字的生命周期

程序开始时 或 类开始加载时就会为 static 修饰的变量分配空间(它们存储在数据段),进程结束时才会释放空间。

  • 定义静态局部变量和静态全局变量创建时可以不给初值,默认初始值为0
  • 成员函数可以定义在类内部,也可以在外部定义(在外部定义时不能加 static 关键字)
  • 成员变量必须在类外部定义其值(在外部定义时不能加 static 关键字)

二. 修饰静态普通函数

使用方法:在函数返回值类型前添加 static

效果:被修饰的函数只能在当前的文件中使用,在其他文件中可以定义相同名称的函数。

解释说明

在一个项目中我们创建两个源文件:main.cpp 和 demo.cpp,如果我们在两个文件中定义了相同名称的函数的话编译就会报错:

在这里插入图片描述

正确的方法是在一个文件中去定义函数,在另一个文件中去引入该函数的声明,这样两个文件中都可以使用这个函数:
在这里插入图片描述

如果我们只想让 Fun() 函数在定义它的文件内使用,而不能被外部文件使用,应该怎么做到呢?我们只需给这个函数加上 static 关键字即可,这样该函数就变为静态函数,其作用域由之前的整个项目内的文件都可访问变为了只能在本文件内被访问:
在这里插入图片描述

demo.cpp 中的 Fun() 函数变为静态函数之后,我们可以在 main.cpp 中声明去定义同名 Fun() 函数了,二者作用域不同,互不影响:
在这里插入图片描述

三. 修饰全局静态变量

使用方法:在全局变量前添加 static

作用效果:把全局变量的作用域缩小为只能在本文件内访问,生命周期不变。

解释说明

1、数据位于静态区,自动初始化为0,仅用于本文件,其他文件可以定义相同名称变量。

在这里插入图片描述

2、全局变量在外部文件采用 extern 可以访问,但全局静态变量不可访问,它的作用域缩小为仅在本文件内可以访问。

在这里插入图片描述

四. 局部静态变量

使用方法:在局部变量前添加 static

作用效果

  • 把局部变量的生命周期延长(生命周期和全局变量一样,随进程一起结束),但作用域不变。
  • 局部变量(栈区)在函数执行结束后,将会被释放,但静态局部变量会一直存在,直到程序执行结束。

解释说明

1、数据位于静态区,不初始化的话默认值为0

在这里插入图片描述

2、数据存储在静态区,变量只被初始化一次,之后不再初始化,数值在每次调用时根据语句功能进行修改。

在这里插入图片描述

五. 类的静态成员变量

使用方法:在类的成员变量前添加 static,该静态成员变量只能在类的内部定义,外部声明。

作用效果:实现多对象的数据共享,即多对象的静态成员变量只占一处内存,由该类的所有对象共用。

解释说明

1、成员变量必须在类外部定义其值(在外部定义时不能加static关键字),在访问时可以通过类名直接访问

class A
{
    
public:
	static int n;
};

// 类的静态成员变量只能在类外部定义(类外部定义时不能加static关键字),类内部声明
int A::n = 10;

int main()
{
    
	// 1、通过示例对象访问静态成员变量
	A a;
	cout << a.n << endl;// 输出10
	
	// 2、因为类的静态成员变量是所有该类的对象所共享的
	//    所以也可以通过类名直接访问
	cout << A::n <<endl;// 输出10
	return 0;
}

2、静态成员变量必须定义设初值,否则编译不通过

在这里插入图片描述

3、静态成员变量的访问也是受类的访问限定符得限制的

在这里插入图片描述

六. 类的静态成员函数

使用方法:在类的成员函数返回值类型前加 static

作用效果:为多对象提供服务,函数内部无法访问属于类对象的非静态成员,只能访问类的静态成员。

解释说明

1、类的内部、外部都可以定义类的成员函数

在这里插入图片描述

2、普通成员函数隐含this指针在第一个参数,它指向对象本身,因而可以访问对象的成员;而静态成员函数没有this指针,所以:

  • 非静态成员函数可以任意地访问静态成员和非静态成员。
  • 静态成员函数不能访问非静态成员,只能访问静态成员。

3、static 成员函数不能被 virtual 修饰,static 成员不属于任何对象或实例,所以加上 virtual 没有任何实际意义;静态成员函数没有 this 指针,虚函数的实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用的,所以不能为virtual;

虚函数的调用关系:this->vptr->ctable->virtual function

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_51064412/article/details/129452140

智能推荐

Hive(总)看完这篇,别说你不会Hive!-程序员宅基地

文章浏览阅读7w次,点赞360次,收藏3.4k次。文章目录1.Hive入门1.1什么是Hive1.2 Hive的优缺点1.2.1 优点1.2.2 缺点1.3Hive架构原理2.Hive安装2.1Hive安装2.2HiveJDBC访问2.2.1启动hiveserver2服务2.2.2连接hiveserver2服务2.2.3注意2.3Hive常用交互命令2.4Hive其他命令操作2.5Hive常见属性配置2.5.1数据仓库位置配置2.5.2查询后信息显示配置2.5.3运行日志信息配置3.Hive数据类型3.1基本数据类型3.2集合数据类型3.3类型转化4.DD

dataframe合并与去重两个方法_dataframe merge去重-程序员宅基地

文章浏览阅读8k次。(一)用mergehttps://blog.csdn.net/sinat_38068807/article/details/90577105(二)用concathttps://blog.csdn.net/sinat_38068807/article/details/90515142_dataframe merge去重

pyinstaller将py文件打包成EXE文件(保姆级教程)_pyinstaller打包py文件为exe-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏19次。一、PyInstaller 库的安装1.一般安装步骤:pip install pyinstaller一般的安装方法是在cmd命令提示符环境下输入:window+r 运行cmd输入以下内容切换到pip目录下输入pip install pyinstaller2.使用python安装PyInstaller打开python设置项目添加搜索安装软件包安装完成二、 pyinstaller的使用打开cmd命令提示符 切换到pyinstaller..._pyinstaller打包py文件为exe

c++如何让字符串重复输出_[Python学习笔记]Python基础02之字符串-程序员宅基地

文章浏览阅读409次。点击上方蓝字关注我们,一起涨姿势!在Python基础01之入门中,我们学习了Python中的输入(input()),输出(print())的使用,变量赋值,简单运算符的相关知识,今天一起来学习字符串的知识。一、字符串基础字符串是 Python 中最常用的数据类型,它是一种不可变序列。可以使用引号来创建字符串,引号可以是'单引号'"双引号" '''三单引号''', """三双引号""",单..._c++连续输出三个字符可以用乘号吗

虚拟机、容器与沙盒技术有什么区别?_docker和sandbox-程序员宅基地

文章浏览阅读1k次。虚拟机和容器技术都可以看作是沙箱的不同表现。虚拟机和容器。前者是对硬件的虚拟化,后者则更像是操作系统的虚拟化。两者都提供了沙箱的能力:虚拟机通过硬件级抽象提供,而容器则使用公共内核提供进程级的隔离。_docker和sandbox

PR导出错误怎么办?解决PR导出视频提示“编译影片时出错“ GPU渲染错误 错误代码:-1609629695-程序员宅基地

文章浏览阅读4.9w次,点赞7次,收藏11次。有位用户在使用PR模板制作视频时,遇到PR导出出错的问题,问题描述:编译影片时出错,加速渲染器错误”(如下图所示)编译影片时出错。GPU渲染错误无法处理帧。这部分因视频内容不同而出错提示不同,所以省略…组件EfedFillert类型 GPU视频滤镜选择器:9错误代码:-1609629695于是亲测该PR模板:PR模板 卖房售房租房酒店促销等产品幻灯片展示PR视频模板找到了解决办法。如果你也遇到同样问题,可以尝试下面的方法哦。1、点击菜单“文件”,选则“项目设置”,点击“常规”。如._-1609629695

随便推点

centos下安装ffmpeg加上fdk-aac的支持-程序员宅基地

文章浏览阅读438次。本文参考自:https://blog.csdn.net/jklinux/article/details/72367829安装包可以从这里下载https://download.csdn.net/download/yinsui1839/10433905没有积分的同学可以在评论区发邮箱给我先安装yasm:解压yasm-1.3.0.tar.gzcd yasm-1.3.0/./confi..._centos fdk-aac

pytorch模型加密_pt模型加密-程序员宅基地

文章浏览阅读2.4k次。文章目录前言一、AES加密二、使用步骤总结前言pytorch模型的AES加密一、AES加密秘钥:加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来必须是16位字节或者24位字节或者32位字节(因为python3的字符串是unicode编码,需要 encode才可以转换成字节型(bytes)数据)明文:需要加密的参数,字节长度需要是16位的倍数模式:aes 加密常用的有 ECB 和 CBC 模式iv 偏移量:这个参数在 ECB 模式下不需要,在 CBC 模式下需要二、使用步骤针对模型,_pt模型加密

i.MX8MPlus中的CLK子系统_imx8mm_clocks_init-程序员宅基地

文章浏览阅读1.1k次。芯片手册中的clk框架CCM(Clock Control Module)框架图外部时钟的输入源有24MHz,32.768KHz以及四个EXT CLK。这7个输入源都可以直接连接到CCM,但是PLL只能以24MHz,32.768KHz作为输入。从PLL和分频器出来的时钟也可以作为CCM的输入。每一个Slice在经过MUX模块后,由分频器产生我们需要的时钟频率,然后再输出给Gate模块,以便控制时钟的开关。CLK ROOT相关寄存器每一个Slice都有自己的index、偏移地址和时钟源配置寄存器CC_imx8mm_clocks_init

html5动效系列二:超级惊艳 10款HTML5动画特效推荐_html5加载动画特效-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏63次。文章来源:http://www.lanlanwork.com/blog/?post=2684蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供有效的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务每一个扁平化界面设计_html5加载动画特效

Handler dispatch failed; nested exception is java.lang.StackOverflowError_handler dispatch failed nested-程序员宅基地

文章浏览阅读2.3w次,点赞3次,收藏5次。今天在写SSM项目的时候,遇到Handler dispatch failed; nested exception is java.lang.StackOverflowError这样的错误,真的是我太马虎,这里SSM是用聚合项目来管理各个模块,对于不同的service和dao模块之间可能需要手动依赖StackOverflowError通常情况下是死循环或者是循环依赖了。出现这样错的原因:没有..._handler dispatch failed nested

【开源】串口YMODEM实现IAP程序升级(附工程源码)_ymodem工具-程序员宅基地

文章浏览阅读7k次,点赞15次,收藏132次。GD32串口 、YMODEM 、IAP升级_ymodem工具