Static in C++

static根据上下文会有两种含义,他们的区别如下

  • **在类class或者是在结构体struct 外 **使用static

    • 类外的static修饰的符号在link阶段是局部的
  • **在类class或者是在结构体struct 内 **使用static
    • 若在类内或结构体内使用,则代表这个部分内存是这个类的所有实例共享的,简单来说,就算你实例化了很多次这个类或者结构体,但那个静态(static)变量只会有一个实例(有点全局变量的味道在里面了)

当static在类外

在类外使用static的含义是它表示这个变量or函数在link的时候只在这个编译单元(.obj)里可见!

static变量或函数表示在link到它实际的定义时,linker不会在这个编译单元(.obj)外面找它的定义(这有点像class里面声明私有成员,其他的编译单元不能访问static修饰的变量)

一个我不懂的点:前缀extern是用来强制声明一个变量or函数的,extern A表明A在其他编译单元(or其他地方)有过定义了,让编译器别慌,直接用就对了,属于是强制声明

总结一点来说:在类外用static,这意味着,你定义的函数和变量只对它声明所在的cpp文件(编译单元)是“可见"的

具体的应用是:可以在头文件里写变量和函数,然后用static做前缀,这样子在两个cpp文件里同时包含该头文件时就不会出错,毕竟#include的原理就是复制粘贴。更具体的应用场景可以参考在类中用私有成员时的场景,基本上static用的越多越好,如果不想让变量全局可见的话(毕竟全局可见其实是相当痛苦的事情,很容易一个cpp影响一堆cpp,导致各种奇怪的bug,所以并不赞同使用全局变量)

故使用重点是:尽量让全局函数和变量使用static标记,除非它们必须要用在其他编译单元里(两个编译单元做联动)

当static在类内

  • 在类内用static修饰变量or函数的含义:在这个类的所有实例中,这个变量or函数只有一个实例

    • 可以理解成类内的全局变量,在一个实例中改变了static修饰的变量,则这个改变会体现在所有实例中,因为这个变量只有一个,即使建立了很多实例,所以通过类实例引用静态变量是没意义的,因为这就像是这个类的全局实例

    • class example {
      static int a = 1;
      };
      int main()
      {
      example A;
      //std::cout << A.a; 这里就是引用a,其实是没有意义的
      //完全等效于:
      std::cout << example::a; //甚至都不需要实例就可以直接调用!!!
      return 0;
      }
    • 静态的方法(函数)亦如此,静态方法不通过类的实例就可以调用(使用类名加::就可以访问),在静态方法的内部也无法访问到类的实例

  • 当static在if,for或函数等局部作用域内

    • 相当于把修饰的东西的生命期变成永久(所谓的静态),在离开作用域后并不会被系统自动回收内存,而是一直保留
    • 虽然生命期长了,但是作用域仍然不变!,比如在函数A中定义static x,则变量x不能从函数A外调用,只能在函数A内使用!

Static in C++的更多相关文章

  1. static,你还敢用吗?(二)

    为了压系统,昨天小组在测试环境模拟了一大批订单数据.今天上午查看记录的账单计息日志,发现了一大堆的MySqlException MySql.Data.MySqlClient.MySqlExceptio ...

  2. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  3. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  4. PHP static静态属性和静态方法

    这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...

  5. static,你还敢用吗?

    我用火狐的HttpRequester测试开发组里一个同学发布的Web API接口,遇到了一个奇怪的问题. 我测试边界情况时,第一次调用响应的结果是正常的,但当再次及以后的请求时,却返回了异常“Syst ...

  6. Java关键字:static

    通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...

  7. Android 中关于static的使用问题

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...

  8. iOS: 在UIViewController 中添加Static UITableView

    如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ...

  9. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  10. 今天思考一个问题,PHP const和static的区别

    static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ...

随机推荐

  1. Python时间处理,datetime中的strftime/strptime+pandas.DataFrame.pivot_table(像groupby之类 的操作)

    python中datetime模块非常好用,提供了日期格式和字符串格式相互转化的函数strftime/strptime 1.由日期格式转化为字符串格式的函数为: datetime.datetime.s ...

  2. Numpy库基础___三

    ndarray一个强大的N维数组对象Array •ndarray的操作 索引 a = np.arange(24).reshape((2,3,4)) print(a) #[[[ 0 1 2 3] # [ ...

  3. Failed to execute "C:\learn\C\程序练习\1.exe": Error 0: 操作成功完成。 请按任意键继续. . .问题解决

    在DEV中编译运行时出现以上提示,原因是该文件被杀毒软件隔离了,认为它是病毒文件 解决办法,找到该文件进行恢复

  4. CentOS 7.5 安装配置tigervnc-server

    系统版本: [root@s10 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 1.安装 Gnome 包 [root@ ...

  5. 使用cgroup和tc限制带宽

    cgroup子系统net_cls 可以给 packet 打上 classid 的标签,用于过滤分类,这个classid就是用于标记skb所属的 qdisc class 的.有了这个标签,流量控制器(t ...

  6. FPGA设计流程

    今天学习了FPGA设计流程的视频,我理解要做一个完整的FPGA系统,所要经历的步骤,先将它简单总结如下: 我在对上面的流程图进行解释: 第一:设计定义就是我们这个FPGA系统或者FPGA设计所要实现的 ...

  7. bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)

    bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树) bzoj Luogu 题目描述略(太长了) 题解时间 切掉一个点,连通性变化. 上圆方树. $ \sum |S| ...

  8. java实现稀疏矩阵的压缩与解压

    任务要求 把棋盘当作一个稀疏矩阵,0表示没棋,1表示黑棋,2表示蓝棋. 把该稀疏矩阵压缩以三元组形式表示并以文件形式保存,再写另一个程序读取文件中的信息把压缩后的三元组还原成原来的稀疏矩阵. 其中三元 ...

  9. Xshell 连接虚拟机OS Linux 设置静态ip ,网络配置中无VmWare8 的解决办法

    前序:最近开始研究Hadoop平台的搭建,故在本机上安装了VMware workstation pro,并创建了Linux虚拟机(centos系统),为了方便本机和虚拟机间的切换,准备使用Xshell ...

  10. ThreadLocal 是什么?有什么用?

    ThreadLocal 是一个本地线程副本变量工具类.主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的 ...