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. Lua中如何实现类似gdb的断点调试—07支持通过函数名称添加断点

    我们之前已经支持了通过函数来添加断点,并且已经支持了行号的检查和自动修正.但是通过函数来添加断点有一些限制,如果在当前的位置无法访问目标函数,那我们就无法对其添加断点. 于是,本篇我们将扩展断点设置的 ...

  2. 路径查找算法应用之A*算法

    环境:Visual Studio 2017 + .Net Framework 4.5 应用场景:在画板上查找起始点和目标点之间的最短最直路径,最后画出连接两个点之间的折线. 算法简介:A*算法是一种性 ...

  3. netty通信

    学习netty之前,要先了解操作系统中的IO.零拷贝(已经附上链接了) 一.netty的简单介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Ne ...

  4. LGP6276题解

    众所周知,排列是一个置换,一个置换是一车环. 步数就是这些环长的 \(lcm\). 如果你去思考直接 DP,会发现很困难,根本设不出来状态.于是考虑正难则反:每个质数幂 \(p^k\) 对答案的贡献. ...

  5. LGP6156题解

    真·简单题 题目大意 给定 \(n\) 和 \(k\),求出这个柿子的值: \[\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\mu^2(\gcd(i,j)gcd(i,j) \] 按照 ...

  6. Python函数-5 生成器

    生成器有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的.比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表 ...

  7. [MRCTF]XOR-无法生成反汇编的处理

    主程序,无法生成伪代码 由此分为两种方法即: 直接看反汇编 解决问题,尝试生成伪代码 硬啃汇编 输入与输出 判断输入长度是否为0x1B,其中al为eax的低8位 将输入的字符每个与当前字符所在下标异或 ...

  8. C++ md5 函数

    转 http://www.zedwood.com/article/cpp-md5-function MD5 is no longer considered cryptographically safe ...

  9. Servlet的会话机制?

    因为http协议是无状态协议,又称为一次性连接,所以webapp必须有一种机制 能够记住用户的一系列操作,并且唯一标示一个用户. Cookie: 又称为小饼干,实际就是使用一个短文本保存用户信息, 在 ...

  10. Shiro Session放到Redis中常遇到的问题

    Shiro会话管理:https://shiro.apache.org/session-management.html#SessionManagement-CustomSessionIDs Redis主 ...