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. springboot Redistemplate的execute和 executePipelined

    springboot 的 RedisTemplate 的 execute 和 executePipelined 功能的区别 1.execute 以下是 springboot 官网原文: Redis p ...

  2. 安装ncclient出现rust版本不对问题解决

    在windows上安装ncclient的时候,出现了提示说rust版本需要至少1.14.0以上版本 解决办法: 在https://www.rust-lang.org/tools/install下载新版 ...

  3. Windows 10平台安装PostgreSQL 14.2详细教程

    Windows 10平台安装postgreSQL 14.2.1,安装步骤很简单,基本上是点击下一步(next). 使用SQL Shell(psql)进行交互:使用pgAdmin工具进行管理. tips ...

  4. Java基础——继承的特点

    继承的优点: 1.提高了代码的复用性(多个类相同的成员可以放到一个类中) 2.提高了代码的维护性(如果要修改方法,只需要修改父类中的即可) 继承的缺点: 1.继承让类与类产生了关系,类的耦合性增强了, ...

  5. windows服务器怎么将证书添加到受信任证书颁发机构

    1.键盘输入win+r 快键键,出现运行,输入mmc. 2.打开控制台根节点,点击上方导航栏的文件-->添加删除管理单元.如下图. 3.在可用的管理单元中选择"证书",计算机 ...

  6. 如何用系统命令sc修改系统服务

    系统服务是系统的一项重要组成部分,sc命令在特定权限下,可以实现对指定服务的启动项.配置文件及状态进行修改,位置在c:\windows\system32\目录下面,下面就和大家分享一下如何用系统命令s ...

  7. 创建自定义ClassLoader,绕过双亲委派

    1.什么是类加载 通过javac将.java文件编译成.class字节码文件后,则需要将.class加载到JVM中运行,哪么是谁将.class加载到JVM的呢?那就是类加载器啦. 2.类加载器类型 B ...

  8. js file对象 文件大小转换可视容易阅读的单位

    function returnFileSize(number) { if(number < 1024) { return number + 'bytes'; } else if(number & ...

  9. Spring Boot 的配置文件有哪几种格式?它们有什么区别?

    .properties 和 .yml,它们的区别主要是书写格式不同.    1).properties    app.user.name = javastack    2).yml    app:   ...

  10. Hystrix相关注解?

    @EnableHystrix:开启熔断 @HystrixCommand(fallbackMethod="XXX"):声明一个失败回滚处理函数XXX,当被注解的方法执行超时(默认是 ...