static详解

2023-10-31

一、修饰普通变量

1.局部变量

用法:static + 变量类型 + 变量名

内存中的位置:静态存储区

初始化:未经初始化的局部静态变量会被自动初始化为 0(自动对象的值是任意的,除非他被显示初始化)。

作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但

是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它
进行访问,直到该函数再次被调用,并且值不变。
即:static修饰的局部变量的生命周期被改变(栈区---->静态存储区),但是作用域不变。

2.全局变量

用法:static + 变量类型 + 变量名

内存中的位置:静态存储区

初始化:未经初始化的全局静态变量会被自动初始化为 0(自动对象的值是任意的,除非他被显示初始化)。

作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文

件结尾。
注意:static修饰全局变量,并未改变其存储位置及生命周期,而是改变了其作用域,使当前文件外的源文件无法访问该变量。
3.静态函数

用法:函数返回类型前加 static

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

注意:

  • 不要在头文件中声明 static 的全局函数。
  • 不要在 cpp 内声明非 static 的全局函数。
  • 如果你要在多个 cpp 中复用该函数,就把它的声明提到头文件里去,否则 cpp 内部声明需加上 static 修饰

二、修饰类变量

1.成员变量

静态成员是类的所有对象中共享的成员,而不是某个对象的成员。对多个对象来说,静态数据成员只存储一处,供所有对象共用, 包括派生类的对象。因此,static成员必须在类外进行初始化,而不能在构造函数内进行初始化, 不过也可以用const修饰static数据成员在类内初始化(初始化列表)。

2.成员函数

静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,
对静态成员的引用不需要用对象名。
静态成员函数没有this指针,因此
  • 静态成员函数只能调用静态成员变量,无法直接调用非静态成员变量。
  • 如果静态成员函数中要引用非静态成员时,可通过对象来引用。

静态成员变量和函数均可通过类名 + 作用域的方式访问

class A {
public:
	A(int s, int ss){
		a = s;
		b = ss;
	}
public:
	static void dis() {
	    //cout << a << endl;    //error,非static成员
        cout << b << endl;    //ok,static成员
    }

public:
	int a;
	static int b;
};

int A::b = 8888;    //类外初始化

int main() {
    cout << A::b << endl;    //8888
    A::dis();                //ok,static成员变量和函数可以通过 类名 + 作用域 直接调用
    return 0;
}

注意:不可以同时用const和static修饰成员函数。
C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。

总结

  • 对于函数定义和代码块之外的变量声明,static 修改标识符的链接属性,由默认的 external 变为 internal,作用域和存储类型不改变,这些变量只能在声明它们的源文件中访问。
  • 对于代码块内部的变量声明,static 修改标识符的存储类型,由自动变量改为静态变量作用域和链接属性不变。这种变量在程序执行之前就创建,在程序执行的整个周期都存在。
  • 对于被 static 修饰的普通函数,其只能在定义它的源文件中使用,不能在其他源文件中被引用。
  • 对于被 static 修饰的类成员变量和成员函数,它们是属于类的,而不是某个对象,所有对象共享一个静态成员。静态成员通过<类名>::<静态成员>来使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

static详解 的相关文章

随机推荐

  • MQTT协议

    http www blogjava net yongboy category 54835 html
  • 树莓派的连接与AP局域网路由器配置

    文章目录 前言 1 树莓派的连接 1 1 本地连接 1 2 远程连接 2 AP路由器配置 2 1 配置无线局域网 2 2 配置以太网实现局域网 前言 树莓派的连接方式分为两种 本地和远程 也可以通俗的说是有本地设备还是就一台笔记本的情况 本
  • 解决:无法解析的外部符号__iob_func

    解决 无法解析的外部符号 iob func 原文 http blog csdn net hebbely article details 53780562 在使用 VS2015 下使用 libjpeg turbo 静态库 编译时报错了 cpp
  • 【用户增长】用户增长方法论及增长思维

    用户增长方法论及增长思维 1 什么是用户增长 1 1 用户增长的概念及内涵 用户增长不是简单的用户数量的增长 用户增长是一个系统化 综合化的体系 用户增长包含三个阶段的增长 综上三点 我们可以简单的将用户增长定义为 通过痛点 产品 渠道 创
  • 编写第一个Makefile(HelloWorld)

    什么是Makefile 讲makefie之前 先将将什么是make make是一个命令工具 是一个解释makefile中指令的命令工具 它可以简化编译过程里面所下达的指令 当执行 make 时 make 会在当前的目录下搜寻 Makefil
  • 建站系列(八)--- 本地开发环境搭建(WNMP)

    目录 相关系列文章 前言 一 准备工作 二 Nginx安装 三 MySQL安装 四 PHP安装及Nginx配置 五 总结 相关系列文章 建站系列 一 网站基本常识 建站系列 二 域名 IP地址 URL 端口详解 建站系列 三 网络协议 建站
  • ServletConfig对象

    目录 一 ServletConfig对象定义 二 ServletConfig对象作用 三 ServletConfig中的方法 一 ServletConfig对象定义 ServletConfig是什么 ServletConfig是一个接口 位
  • 3. 无重复字符的最长子串

    给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解释 因为无重复字符的
  • [转]iPhone多渠道自动打包Shell脚本介绍

    转 iPhone多渠道自动打包Shell脚本介绍 摘要 随着苹果手持设备用户的不断增加 ios应用也增长迅速 同时随着iphone被越狱越来越多的app 的渠道也不断增多 为各个渠道打包成了一件费时费力的工作 本文提供一种比较智能的打包方式
  • Java方法递归的简单例题

    目录 递归 1 递归求N 的阶乘和递归求1 2 3 4 n 2 按顺序打印一个数字的每一位 3 斐波那契数列和青蛙跳台阶问题 4 汉诺塔问题 递归 递归 简单来说 就是方法自己调用自己的过程 那要怎么样去实现递归呢 首先 我们需要去根据条件
  • 单页面(SPA)与服务端渲染(SSR),概念、区别,优缺点

    单页面 SPA 与服务端渲染 SSR 概念 区别 优缺点 什么是单页面应用 什么是多页面应用 二者有什么区别 1 单页面应用与多页面应用 单页面顾名思义就是整个应用只有一个Html页面 页面的切换其实是组件的切换 这样设计的好处就是不进行页
  • 多元回归分析

    多元回归分析 RF随机森林多输入单输出预测及变量重要度衡量 Matlab完整程序 目录 多元回归分析 RF随机森林多输入单输出预测及变量重要度衡量 Matlab完整程序 预测结果 评价指标 基本介绍 程序设计 参考资料 预测结果 评价指标
  • 进程——wait函数

    wait 的函数原型是 include
  • 使用Vue-Cli4.x配置文件路径别名

    vue脚手架版本升级到4 x以后 目录发生了很大的变化 有些配置需要我们自己去配置 自己项目中的目录结构 在根目录创建一个 vue config js文件 配置一下引入文件路径的别名 const path require path cons
  • C++报错 invalid operands to binary expression

    invalid operands to binary expression 二进制表达式的操作数无效 顾名思义 错误出在操作符上 对类型的操作问题 比如两种不能比较的类型进行了比较 比如我这里
  • 剑指Offer第三十一题:整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述 求出1 13的整数中1出现的次数 并算出100 1300的整数中1出现的次数 为此他特别数了一下1 13中包含1的数字有1 10 11 12 13因此共出现6次 但是对于后面问题他就没辙了 ACMer希望你们帮帮他 并把问题更加普
  • 组合pig和hive来进行数据分析

    接到产品一个任务 需要对使用产品的用户操作系统来个分析 对清洗后的hive数据进行分析 发现 数据恰恰把操作系统数据 进行了过滤 只有到rawlog里去进行数据分析了 但由于rawlog没有和数据库进行关联 就只有先对rawlog进行初步手
  • Kotlin Lambda和高阶函数

    Lambda和高阶函数 本文链接 文章目录 Lambda和高阶函数 lambda 输出 返回类型 深入探究 泛型 inline原理探究 高阶函数 集合 泛型 自己实现Kotlin内置函数 扩展函数原理 companion object 原理
  • java解析zip文件(无需解压即可解析)

    个人原创博客 德鲁大叔撸代码 对zip文件直接进行解析 一条记录对应一行数据 public void readZipCvsFile File file throws Exception 获得输入流 文件为zip格式 zip可以包含对个文件
  • static详解

    一 修饰普通变量 1 局部变量 用法 static 变量类型 变量名 内存中的位置 静态存储区 初始化 未经初始化的局部静态变量会被自动初始化为 0 自动对象的值是任意的 除非他被显示初始化 作用域 作用域仍为局部作用域 当定义它的函数或者