Static in C++

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内使用!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值