static关键字在c/c++中的作用

2023-05-16

static关键字在c/c++中的作用

static在c语言中有三个作用:

修饰函数
修饰局部变量
修饰全局变量

  • 被static修饰的全局变量被称之为静态全局变量。静态全局变量和全局变量在存储方式上是一致的,都储存在数据段,编译阶段分配内存空间,在程序结束时释放。但是,对于多文件的程序来说,静态全局变量只在定义该变量的源文件内有效,也就是我们常说的它具有隐身属性。
  • 对于修饰局部变量:当一个局部变量被static修饰后,它就类似于是一个全局变量,程序结束时才释放,它也储存在数据段
  • 对于修饰函数:static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。这样做的好处是:其他文件中可以定义相同的名字,防止命名冲突.静态函数不能被其他文件所用

static在c++中的作用:

  • 修饰类的成员函数
  • 修饰类的成员变量
    有一个需求:我们想知道一个程序创建了几个对象:
int _count=0;//先定义一个全局变量_count
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{
		_count++;
		cout << "Date(int,int,int):" << this << endl;
	}

	Date(Date& d)
		: _year(d._year)
		, _month(d._month)
		, _day(d._day)
	{
		++_count;
		cout << "Date(const Date&):" << this << endl;
	}

	Date& operator=(const Date& d)
	{
		cout << this << "=" << &d << endl;
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}

		return *this;
	}

	~Date()
	{
		cout << "~Date():" << this << endl;
		_count--;
	}

private:
	int _year;
	int _month;
	int _day;
};

void TestDate()
{
	Date d1(2020,10,18);
	Date d2(d1);
}

int main()
{
	Date d(2020, 10, 18);
	TestDate();
	return 0;
}

每次创建一个对象,就要调用构造函数,_count就会++,每次对象生命周期结束,对象要被销毁,调用析构函数,_count–
但是在主函数中还是可以修改全局变量的值,导致代码不安全,为了防止这种现象,我们就引入了静态成员这一概念。
静态成员:被static修饰的成员称之为静态成员,静态成员变量是所有的对象共享的,且静态成员变量并不包含在对象中(不占据对象的内存空间),它是类的一个属性,并不是单独一个对象的属性。
注意:静态成员变量在类里边只能算是一种声明,如果要初始化必须要在类外,它不能在构造函数初始化列表进行初始化

静态成员变量有两种访问方式:

Date d0;
cout << d0._count << endl;
cout << Date::_count << endl;

①对象.的方式,这种方式如果单独的为了访问静态成员变量就得多创建一个对象出来,不太方便,所以还有第二种访问方式
②域解析操作符,Date::_count,这种方式可以直接通过类来对静态成员变量进行访问,二者在底层的实现是相同的。

什么是静态成员函数?

答:被static修饰的成员函数称之为静态成员函数,他和普通成员函数的区别是既可以通过对象.的方式调用,也可以通过域解析操作符直接新型访问(前提是该静态成员函数必须是public),即双重保险(public:static)。
所以,被private修饰的成员(不论是成员变量还是成员函数),不论是对象.的方式还是类的与解析操作符的方式,都不能在类外进行访问,但初始化静态成员变量是一个例外,因为静态成员变量一定要初始化,且只能在类外初始化。
静态成员函数参数中是没有this指针的,所以它不能被const来修饰

  • 因为const修饰的类成员函数本质并不是在修饰函数,而是在修饰函数隐藏的参数 *this,既然static修饰的成员函数没有this指针,所以它不能被const修饰
  • 同理: 拷贝构造函数,赋值运算符重载,构造函数不能被static来修饰
  • 静态成员函数不能调用非静态成员函数,但是非静态成员函数可以调用静态成员函数。因为静态成员函数没有对象,即:有对象可以调用没对象,没对象不能调用有对象

静态成员函数作用:

不属于类对象,所以可以不通过对象而执行,但逻辑上属于类,实现数据封装,
并且1.提供一种方式访问静态成员变量
2.避免使用全局函数,为函数设置一个类域的访问权限

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

static关键字在c/c++中的作用 的相关文章

  • 使用结构体方式访问寄存器的实践

    朱老师单片机课程学习记录 span class token macro property span class token directive keyword ifndef span GPIO H span span class token
  • MIM,MOM和MOS电容的区别

    ic layout经常会遇到这三种电容 xff1a MOS xff0c MOM xff0c MIM MOS 电容 xff1a 两端结构的mos管 xff0c 电容值不精确 xff0c 可以实现随控制电压变化而变 化的容值 xff0c 上下极
  • 折叠共源共栅放大器Cadence仿真

    仿真原理图如下 xff0c 图中M4的宽长比应该和M5一样 xff0c 为4u 150n m nf为1 2 M8和M9的宽长比为4u 500n 完整的电路图如下 xff1a cascode晶体管的L给小一点 xff0c 电流镜晶体管L给大一
  • 二级运放的Cadence仿真

    基于之前做的折叠共源共栅cascode xff0c 在后面加两个管子 xff0c 变成一个简单的二级运放 二级运放的通带内的增益大于80dB xff0c GBW为大于50M xff0c 相位裕度大于60 为了保证运放的相位裕度 xff0c
  • 射频接收机的参数计算

  • 户外系统原理方框图

  • bandgap中简并点理解与仿真

    综合EETOP论坛上的解答以及自己的仿真 xff0c 一般来说一个电路有可能存在一个以上满足KCL KVL电路方程的解 工作点 这些解中有的是稳定解 有的可能是非稳定解 其区别在于 如果电路目前工作在稳定解 当出现扰动时 比如实际电路中的噪
  • GPS卫星定位基本原理

    GPS定位基本原理 GPS测量定位方法分类 定位模式 xff1a 绝对定位 xff08 单点定位 xff09 相对定位 差分定位 定位时接收机天线的运动状态 xff1a 静态定位 xff0d 天线相对于地固坐标系静止 动态定位 xff0d
  • c++缺省参数,函数重载详解

    c 43 43 缺省参数 xff0c 函数重载详解 缺省参数什么是缺省参数 xff1f 缺省参数的分类 1 全缺省参数 2 半缺省参数 规则 xff1a 缺省参数只能从右往左 xff0c 依次给出 xff08 这是规定 xff09 函数重载
  • 和小白一起学数据结构三之c与结构及联合

    和小白一起学数据结构 xff08 三 xff09 今天博主动笔有些晚了哈 xff0c 所以不讲太多废话了 xff0c 直接上干货 xff01 今天我们来复习c语言提供的两种聚合数据类型 xff08 aggregate data type 数
  • 持之以恒(一)位姿转换:姿态 / 四元数 / 旋转矩阵 / 欧拉角 及 位姿矩阵

    文章目录 1 简介1 1 位姿的几种表示形式1 2 姿态转换在线工具 2 位姿转换接口2 1 旋转向量 转 四元数2 2 四元数 转 旋转向量2 3 四元数 与 旋转矩阵 3 机器人相关应用3 1 不同厂家协作机器人的位姿表示形式 1 简介
  • 基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序

    基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 目录 基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 前言 一 实验器材 二 硬件资源 1 usb转ttl 2 串口1 波特率 9600 P2 2 P2
  • 一个程序从开始运行到结束的完整过程

    目录 预编译编译汇编链接 我们平时不管是在 Windows 下的编译器直接点击执行一个代码 xff0c 还是在 Linux 下通过 gcc g 43 43 生成可执行文件并执行 xff0c 都会直接出来代码的运行结果 但实际上它还细分为以下
  • cpp-http 库的使用

    文章目录 前言 96 cpp http 96 库简介 96 cpp http 96 库使用介绍http 客户端搭建步骤http 服务端搭建步骤 96 cpp http 96 库示例服务端实现客户端实现 示例下载关于示例代码编译出错的问题 参
  • vscode编译器卡顿问题

    最近一段时间使用vscode没有了以前的丝滑的感觉 xff0c 百度了很多种办法 xff0c 比如 xff1a 在文件 gt 首选项 gt 设置 中 xff0c 将 search followSymlinks 设置为false xff0c
  • 问题解决记录集合

    1 解决pytorch下载mnist等数据集速度过慢 失败问题 xff1a https blog csdn net weixin 44414948 article details 109756003 utm medium 61 distri
  • java 通过onvif抓取海康摄像头图片

    java 通过onvif抓取海康摄像头图片 文章目录 java 通过onvif抓取海康摄像头图片前言一 把onvif jar放到自己的maven仓库二 pom文件引入jar包三 测试代码四 运行中的变量五 参考链接地址 前言 网上也有类似的
  • java常见面试题(二)

    java基础二 11 抽象类必须要有抽象方法吗 xff1f 不需要 xff0c 抽象类不一定非要有抽象方法 示例代码 xff1a abstract class Cat public static void sayHi System out
  • 2022高教社杯全国大学生数学建模竞赛B题解析(更新完结)

    2022高教社杯全国大学生数学建模竞赛B题解析 xff08 更新完结 xff09 题目解析前言问题一1 11 21 3问题二 题目 B 题 无人机遂行编队飞行中的纯方位无源定位 无人机集群在遂行编队飞行时 xff0c 为避免外界干扰 xff
  • c++的引用和指针原来是这种关系

    c 43 43 的引用和指针原来是这种关系 关于引用引用的概念 xff1a 引用的三种情况 xff1a 当引用作为返回值的时候 xff1a 引用和指针的区别 xff1a 关于引用 引用的概念 xff1a 引用不是新定义一个变量 xff0c

随机推荐

  • java面试题汇总一(会持续更新)

    不积跬步无以至千里 xff0c 这里会不断收集和更新Java基础相关的面试题 xff0c 目前已收集100题 1 什么是B S架构 xff1f 什么是C S架构 B S Browser Server xff0c 浏览器 服务器程序 C S
  • 【STM32】创建stm32工程中,各个文件夹及部分文件作用

    USER xff1a 存放工程文件 主函数文件 main c 以及其他包括system stm32f10x c等 CORE xff1a 用来存放核心文件和启动文件 OBJ xff1a 是用来存放编译过程文件以及hex 文件 STM32F10
  • Qt4.8类继承关系图(全网最全)

    一 概述 在学习Qt的时候快速的查询了解类的继承关系对我们的学习会有很大的帮助 xff0c 而网上流传的多是较老版本的 xff0c 并且是jpg格式 xff0c 不便于学习使用 xff0c 所以我就花了一些时间整理了这一套Qt类继承图 xf
  • Qt5.9类继承关系图(全网最全)

    一 概述 在学习Qt的时候快速的查询了解类的继承关系对我们的学习会有很大的帮助 xff0c 而网上流传的多是较老版本的 xff0c 并且是jpg格式 xff0c 不便于学习使用 xff0c 所以我就花了一些时间整理了这一套Qt类继承图 xf
  • Qt5.15类继承关系图(全网最全)

    一 概述 在学习Qt的时候快速的查询了解类的继承关系对我们的学习会有很大的帮助 xff0c 而网上流传的多是较老版本的 xff0c 并且是jpg格式 xff0c 不便于学习使用 xff0c 所以我就花了一些时间整理了这一套Qt类继承图 xf
  • Qt6.3类继承关系图(全网最全)

    一 概述 在学习Qt的时候快速的查询了解类的继承关系对我们的学习会有很大的帮助 xff0c 而网上流传的多是较老版本的 xff0c 并且是jpg格式 xff0c 不便于学习使用 xff0c 所以我就花了一些时间整理了这一套Qt类继承图 xf
  • DSPF28335 SCI FIFO串口通讯

    在工作过程中 xff0c 通过串口进行上位机与控制器之间进行数据的传输 xff0c 标准的串口通讯容易造成数据的丢失和内存堆满的现象 xff0c 便使用SCI中的FIFO对数据进行中断处理 一 串口通信基本知识 F28335 处理器共有 3
  • 树莓派4B:控制步进电机

    记录一下驱动两相四线步进电机的过程 文章目录 准备阶段接线阶段树莓派python程序 准备阶段 准备以下物品 xff0c 淘宝都可以买到 57步进电机 xff08 两相四线 xff09 电源开关 xff08 220v转24v xff0c 3
  • 2019全国大学生电子设计竞赛(电赛)回忆录

    我给大家整理了历年电赛的题目和材料清单 xff0c 大家可以对比着看 关注微信公众号 Opencv视觉实践 xff0c 回复 电赛资料 领取 电赛是我一进大学就听学长们无数此提起的一场四天三夜的盛会 xff0c 我也自大一开始便期待着 xf
  • 【网络】HTTP中的GET方法和POST方法

    1 GET方法 xff1a 获取资源 GET方法用来请求访问已被URL识别的资源 指定的资源经服务器端接续后返回内容 也就是说 xff0c 如果请求的资源是文本 xff0c 那就保持原样返回 xff1b 如果像是CGI xff08 Conm
  • 类的6个默认成员函数

    类的成员函数 1 构造函数2 析构函数3 拷贝构造函数4 深浅拷贝5 运算符重载赋值运算符重载的特性 xff1a 1 构造函数 xff08 构造函数的调用发生在对象的创建过程中 xff0c 所以会牵扯到this指针传对象的地址问题 另外创建
  • 通过onvif抓取海康摄像头图片,以及解决海康摄像头抓取图片需要验证问题,实现摄像头一段时间换一个地方的同时抓取一张图片。

    1 实现海康摄像头的图片的抓取 思路 xff1a 1 首先获取图片的url xff0c 2通过java实现图片的下载 1 使用onvif获取图片的url 首先获取OnvifDevice的对象 OnvifDevice od 61 new On
  • 超详细电烙铁如何使用?

    电烙铁是电子硬件工程师的一个必备工具了 它主要用来焊接一些电子元器件到PCB主板上 xff0c 用来做一些维修 xff0c 验证 xff0c 分析等等 那这么一个家伙要如何使用呢 xff1f 首先来看一个电烙铁的基本外观 xff1a 它一般
  • Makefile和cmake学习

    一 Makefile 一 什么是Makefile 1 Makefile 可以简单的认为是一个工程文件的编译规则 xff0c 描述了整个工程的编译和链接等规则 其中包含了那些文件需要编译 xff0c 那些文件不需要编译 xff0c 那些文件需
  • Ros下编译某功能包时出现很多“未定义的引用”的解决方法(本人版本是ubuntu18.04)

    问题描述 xff1a 在工作空间下编译某功能包时出现 在函数 中未被定义等问题 xff0c 如图所示 解决方案 xff1a 第一步 xff1a 查看自己的gcc版本和g 43 43 版本是否一致 xff0c 打开终端输入以下命令 gcc v
  • STM32—串口通讯详解

    串口通讯目录 物理层协议层USART简介开发板与上位机的连接代码讲解 xff1a 一 初始化结构体二 NVIC配置中断优先级三 USART配置函数讲解四 传输数据的函数 xff1a 1 发送一个字节2 发送字符串3 重定向printf函数发
  • 二进制数的算术运算和逻辑运算

    算术运算 二进制数加法采用逢二进一 减法采用借一作二 十六进制数加法采用逢十六进一 减法采用借一作十六 1位八进制可以写成3位二进制 xff0c 因为3位二进制可以表示十进制范围0 7 xff0c 也就是1位八进制的表示范围 1位十六进制可
  • STM32串口接收一帧数据方法(处理一帧数据中所需内容)

    stm32支持接受单个数据或者一帧数据 xff0c 若配置单个数据接收中断的话 xff0c 会出现接收包丢包 xff0c 数据不完整的情况 xff01 因此在stm32的串口中断中 xff0c 还有一个IDLE中断 xff0c 用来产生串口
  • 使用火狐拓展插件以及运行脚本的超详细方法

    1 首先我们需要下载火狐浏览器 火狐浏览器官网 xff1a 火狐浏览器 打开后默认页面 xff1a 2 如图所示点击右上角打开菜单 xff0c 然后点击附加组件 xff1a 3 进入该页面后在搜索框输入 xff1a tampermonkey
  • static关键字在c/c++中的作用

    static关键字在c c 43 43 中的作用 static在c语言中有三个作用 xff1a 修饰函数 修饰局部变量 修饰全局变量 被static修饰的全局变量被称之为静态全局变量 静态全局变量和全局变量在存储方式上是一致的 xff0c