静态变量与静态函数

2023-11-08

堆与栈

1、栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值等,操作是类似于数据结构中的栈;

2、堆区(heap):一般有程序员分配和释放(动态存储分配),分配方式类似于链表;

3、全局区(static):全局变量和静态变量的存储,由系统释放;

4、文字常量区:常量字符串存放,系统释放;

5、程序代码区:存放函数体的二进制代码。

堆与栈的区别:

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

全局变量静态(static

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间存在);

2)初始化:未经初始化的静态全局变量会被程序自动初始化为0,普通全局变量未经初始化的值是任意的;

3)作用域:全局静态变量的只在声明它的文件下是可见的(从定义到文件结尾),普通全局变量在整个工程中是可见的。

优点:1)不会被其他文件访问和修改;2)其他文件使用相同的名字的变量不会发生冲突

局部静态变量

1)内存中的位置:静态存储区;

2)初始化:未经初始化的静态局部变量会被程序自动初始化为0,普通局部变量未经初始化的值是任意的;

3)作用域:作用域仍然是局部的,当定义它的函数或语句块结束时,作用域也随之结束。

static修饰局部变量时,修改了局部变量的存储位置,从原来的占中存储改为静态存储区。但是静态变量离开作用域后并没有被销毁,仍然驻留在内存中,知道程序结束,但是不能对其访问;

Static修饰全局变量时,它改变了全局变量的作用域,只在其声明的文件中可见,存储位置内有改变,仍在静态存储区中)

静态函数

函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用

1)静态函数在其他文件中科技定义形同的名字,不会发生冲突;

2)静态函数不能被其他文件所用;

3)静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。

<1>static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
<2>static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
<3>static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

C++类中静态变量与静态函数

在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。

1、静态变量的定义:静态数据成员定义或说明时在前面加关键词static

2、静态变量初始化:与一般成员初始化不同<数据类型><类名>::<静态数据成员名>=<>

(1) 初始化在类体外进行,而前面不加static,(这点需要注意)以免与一般静态变量或对象相混淆。

(2) 初始化时不加该成员的访问权限控制符privatepublic等。

(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。

3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。

4、静态方法不能直接调用一般成员,可以通过对象引用实现调用

静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。在静态成员函数的实现中不能直接引用类中说明的非静态成员(原因是,非静态成员函数需要传入一个this指针),可以引用类中说明的静态成员(这点非常重要)。如果静态成员函数中要引用非静态成员时,可通过对象来引用。从中可看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>);

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

静态变量与静态函数 的相关文章

  • C++之纯虚函数与抽象类

    C 之纯虚函数与抽象类 什么是纯虚函数 什么是抽象类 什么是纯虚函数 纯虚函数是将基类中的函数声明为虚函数 0的函数 纯虚函数只能声明 不能定义 因为纯虚函数没有函数体 纯虚函数的写法为 virtual 函数返回类型 函数名 参数列表 0
  • C++"char"类型的一些解释

    C char 类型的一些解释 char 类型 char 类型的cin和cout 说明 本文适合初学者阅读 为方便叙述和理解 本文牺牲部分严谨性 本文中的概念 数字 代表整数等日常意义上的数而并非书写符号 char 类型 C 中用char类型
  • c++职工管理系统

    要求 代码 management system cpp main函数 include
  • C++基础---递归函数

    1 递归函数 1 1 递归函数的定义 递归函数 即在函数体中出现调用自身的函数 即函数Func Type a 直接或间接调用函数本身 递归函数 在数学上 关于递归函数的定义如下 对于某一函数f x 其定义域是集合A 那么若对于A集合中的某一
  • C++,引用和指针

    引用指的是对什么的引用 是地址引用吗 这不和指针一样吗 引用 Reference 是C 中一种特殊的变量类型 它可以被看作是对另一个变量的别名 即某个变量的引用 引用不是地址引用 它是在语法层面提供的一种更直观 更安全的方式来访问和修改其他
  • Cpp学习——string模拟实现

    目录 一 string的成员变量 二 string的各项功能函数 1 构造函数 2 析构函数 3 扩容函数 4 插入与删除数据的函数 5 运算符重载 6 打印显示函数 7 拷贝构造 8 find函数 一 string的成员变量 在模拟实现s
  • c# 位运算符

    说来惭愧 今天看别人提供的源码 看了这些运算符竟然有些记不起来 在这里就记录一下 首先认识这些运算符 按位与 其实与 逻辑运算符有一致的地方 下面会讲到 按位或 同样与 有类似的地方 按位取反 按位异或 lt lt 左移运算符 gt gt
  • C++基础语法1 break continue floor ceil 简析

    break 用于中断本层的整个循环 continue 用于中断本次循环 并不中断整个循环 而是继续下次循环 for x 0 x lt TEMPLATE X SIZE x for y 0 y lt TEMPLATE Y SIZE y sum
  • 【千律】C++基础:函数的重载

    include
  • devC++强制关机代码shutdown(DAY 26)

    文章目录 1 代码实现 2 运行结果 恶搞同学 这种方式只用改个头文件 再在文章中间加一行输出即可 1 代码实现 2 运行结果 恶搞同学 增加编程乐趣 这种方式只用改个头文件 再在文章中间加一行输出即可
  • 【C++】Vector和String详解

    前言 没错 我又更新了 即使没人看 上一篇文章介绍了有关双向链表的容器list 那问题来了 数组和字符串这种使用频率非常高的数据结构 在STL模板中会不会有让人眼前一亮的实现哪 很明显 有 vertor和string就是这两种数据结构相对应
  • c#10(密封类和密封方法,异常)

    密封类和密封方法 异常 一 密封类 密封类可以用来限制扩展性 如果密封了某个类 则其他类不能从 该类继承 如果密封了某个成员 则派生类不能重写该成员的实现 默认情况下 不应该密封类和成员 密封可以防止对库的类型和成员进行自定义 C 中使用密
  • 【千律】C++基础:string扩展工具箱的使用方法

    include
  • C#基础知识篇:C#网络编程(Socket)使用poll函数判断连接断开问题

    C Socket使用poll函数判断连接断开问题 最近在学习c 的网络编程内容 遇到这样一个问题 在服务器端 如何判断客户端的一个连接是否断开 查找相关资料 得出较好的解决方案是使用socket对象的poll函数 poll函数分析 下面是p
  • C# LINQ的基础使用方法

    关键字 from in where select orderby descending 例子 Linq的简单运用 1 用Linq查询集合中所有符合条件的内容 表达式写法 var result from temp 临时变量 in myList
  • virtualenv: error: unrecognized arguments: --no-site-packages

    使用virtualenv version 看到自己的版本大于20 就可以将如下这段删除 export VIRTUALENVWRAPPER VIRTUALENV ARGS no site packages 我碰到的情况下 user makef
  • 在C++中 ,什么时候用:: ?什么时候用. ?什么时候用->?

    在C 中 什么时候用 什么时候用 什么时候用 gt 在 C 中 和 gt 是三种不同的运算符 用于访问类 结构体 命名空间 指针等的成员 它们的使用场景如下 作用域解析运算符 用于访问命名空间的成员或静态成员 例如 假设有一个命名空间 My
  • C++的文件操作open与close

    先看一下相应的打开文件的不同参数的作用 C open 打开文件 含打开模式一览表 打开模式可以用多个 但符号是 不是 注意啦 比如 ios in ios binary表示用二进制模式 以读取的方式打开文件 ios out ios binar
  • 深入研究C++多态(虚函数和虚继承)

    文章目录 多态的引入 虚函数表 几种常见继承关系中的类内存分布 单继承 多继承 菱形继承 总结 作者 狗子孙 链接 https www jianshu com p 02183498a2c2 来源 简书 简书著作权归作者所有 任何形式的转载都
  • Lambda表达式、std::function、和std::bind函数

    Lambda表达式 std function 和std bind函数 Lambda表达式 capture parameters mutable exception gt return type statement 1 capture 捕获外

随机推荐

  • 魔兽怀旧服联盟服务器不稳定,魔兽世界怀旧服上次被联盟攻击至少三个月前,“单边服”何去何从...

    游戏中我们是朋友 聊天侃地 在这里我们可以无拘无束的发言 不会有任何人阻挠 还有大家最喜欢吐槽的小编 请把口水收集好 随时准备和小编一起吐槽 魔兽世界怀旧服上次被联盟攻击至少三个月前 单边服 何去何从 今天公会一个人表示他被联盟杀了 大家都
  • React性能优化的手段有哪些

    1 使用纯组件 2 使用 React memo 进行组件记忆 React memo 是一个高阶组件 对 于相同的输入 不重复执行 3 如果是类组件 使用 shouldComponentUpdate 这是在重新渲染组件之前触发的其中一个生命周
  • 21. 成语接龙

    小张非常喜欢与朋友们玩成语接龙的游戏 但是作为 文化沙漠 的小张 成语的储备量有些不足 现在他的大脑中存储了m个成语 成语中的四个汉字都用一个1000000以内的正整数来表示 现在小张的同学为了考验他给出了他一个成语做开头和一个成语做结尾
  • HDFS的基础练习--新建目录

    实验 1 在HDFS的 上创建10目录 data01 data10 在浏览器上查看 2 在HDFS data03下递归创建 data05 data06 data07 递归创建 使用命令 hdfs fs mkdir p xx1 xx2 xx3
  • IDEA菜单栏不见了怎么办

    开始时候我的IDEA主菜单不见了 解决方法 打开Idea 按两次shift 并在弹出框内的搜索框里输入 view 然后往下拉 找图里的这个View 点击它 会弹出新的框 然后就 这样主菜单栏就出来了
  • SpringBoot 基础

    1 认识Spring Boot Spring 不同于一般框架 它是一个聚合的框架 通过Spring 框架可以使Java 更为便捷和系统化 Java web 中最为使用的框架为 Spring Framework Spring boot 是 S
  • python中使用apscheduler二步简单完成定时任务设置,用于自动化任务的创建,无人值守后台任务创建

    一 apscheduler的安装 首先需要安装pip 打开CMD输入pip install apscheduler 安装apscheduler模块 安装过程如下图 二 导入apscheduler包 设置参数与需要执行的脚本 coding u
  • Pytorch从0实现Transformer

    文章目录 摘要 一 构造数据 1 1 句子长度 1 2 生成句子 1 3 生成字典 1 4 得到向量化的句子 该阶段总程序 二 位置编码 2 1 计算括号内的值 2 2 得到位置编码 三 多头注意力 3 1 self mask 摘要 Wit
  • Elasticsearch笔记(七):聚合查询

    聚合框架有助于根据搜索查询提供聚合数据 聚合查询是数据库中重要的功能特性 ES作为搜索引擎兼数据库 同样提供了强大的聚合分析能力 它基于查询条件来对数据进行分桶 计算的方法 有点类似于 SQL 中的 group by 再加一些函数方法的操作
  • 高薪全栈工程师必备 Linux 基础

    https mp weixin qq com s biz MzI0MTQwMTMyOQ tempkey OTkzX0xtOTVOZkJQbjVQSnhQaWdFcU5pTXZiZ3BvRW5DaDNiaGg5MXJDdGVCSTdkSlFU
  • 【转载】TCP的seq和ack号计算方法

    seq和ack号存在于TCP报文段的首部中 seq是序号 ack是确认号 大小均为4字节 注意与大写的ACK不同 ACK是6个控制位之一 大小只有一位 仅当 ACK 1 时ack字段才有效 建立 TCP 连接后 所有报文段都必须把 ACK
  • Kotlin 集合框架

    集合概述 Kotlin 标准库提供了一整套用于管理集合的工具 集合是可变数量 可能为零 的一组条目 各种集合对于解决问题都具有重要意义 并且经常用到 集合通常包含相同类型的一些 数目也可以为零 对象 集合中的对象称为元素或条目 例如 一个系
  • Linux 网桥实现分析

    第一部份 源码框架 一 网桥原理 传统的中继器 如HUB 是一个单纯的物理层设备 它将每一个收到的数据包 在其所有的端口上广播 由接收主机来判断这个数据包是否是给自己的 这样 网络资源被极大的浪费掉了 网桥之所以不同于中继器 主要在于其除了
  • kubernetes详解

    kubernetes详解 1 kuberenetes简介 1 1什么是kubernetes 1 2 Kubernetes发展史 1 3 为什么要使用kubernetes 1 4 Kubernetes 特点 1 5 kubernetes特性
  • Class.forName()用法简介说明

    转自 Class forName 用法简介说明 下文笔者讲述Class forName 方法的功能简介说明 如下所示 class对象简介说明 class对象用于表示类 每一个类在JVM中都对应一个class对象 jvm中将使用class对象
  • Keil5 STM32 软件仿真错误

    error 65 access violation at 0x40021000 no read permission 这个错误是Keil引起的 应该是没有识别出芯片的型号 我是在RT Thread OS 仿真运行的时候发现的 这里的仿真芯片
  • ipynb转markdown

    不知道为什么ipynb里面没法显示图片 为了阅读体验 没办法只能转为markdown了 jupyter nbconvert to markdown 特征处理 ipynb
  • 8800个机器学习开源项目为你精选TOP30!

    授权自AI科技大本营 ID rgznai100 本文共图文结合 建议阅读5分钟 本文为大家带来了30个广受好评的机器学习开源项目 最近 Mybridge发布了一篇文章 对比了过去一年中机器学习领域大约8800个开源项目后 选出30个2017
  • chatGPT身份指令

    充当 Linux 终端 我想让你充当 Linux 终端 我将输入命令 您将回复终端应显示的内容 我希望您只在一个唯一的代码块内回复终端输出 而不是其他任何内容 不要写解释 除非我指示您这样做 否则不要键入命令 当我需要用英语告诉你一些事情时
  • 静态变量与静态函数

    堆与栈 1 栈区 stack 由编译器自动分配释放 存放函数的参数值 局部变量的值等 操作是类似于数据结构中的栈 2 堆区 heap 一般有程序员分配和释放 动态存储分配 分配方式类似于链表 3 全局区 static 全局变量和静态变量的存