C++:static:谈一谈static关键字
创始人
2024-01-31 10:08:47
0

C++ static关键词有三种完全不同的用途

  1. 表示一个静态存储期的变量,且具有 internal linkage (俗称:static 变量)
  2. 表示一个静态存储期的变量,但是只在一个局部作用域可见,保证仅初始化一次(俗称:static local变量)
  3. 表示一个 class 的静态成员,整个class共享一份,不绑定到任何 instance (俗称:static member变量)

static 变量

    通常他们在main函数之前初始化,存活到 main函数结束

static int a ;  // static 变量

static local 变量 

   在一个函数体(严格的说是 block scope) 内部,用static 变量就是 static local 变量。

这类变量一般在第一次运行到这段代码就初始化(付出的代价就是每次运行到这里就要检查一遍是否被 初始化)

void func(){static int a ;   // static local 变量
}

static member变量

// A.h
class A
{static int a ;
}
  1. 很明显 符号 a 的地位类似于全局变量,但是问题也随之出现了,当这个头文件被多个翻译单元 include时候,这个符号 a 应该放在哪个文件里比较合适了?
  2. 而且如果有多个文件 include “a.h”但是总不能每个翻译单元都生成一个符号把  ??

于是C++设计者想出了这么一个方案,再加一条语句用来专门生成符号,顺便初始化。

// A.h
class A {static int a; // 不生成符号
}// A.cppinclude "A.h"
int A::a;   // 生成一个符号,并初始化

很显然,变量a 的初始化是在类外进行的,头文件 类内不能初始化,如果我们一定要在类内初始化了 ??我们可以这样做

// A.hclass A 
{static const int a = 0 ;  // 不生成符号,但是在编译时可以读取 a的值
}// A.cpp
#include “A.h”
int A::a;  // 在类外提供一个符号,让其在链接时可以找到符号。

那么如何避免:总不能让每个翻译单元都有一个符号把了 ??

C++17引入了 inline修饰符,添加了 inline修饰符后,就可以每个翻译单元生成一个符号,然后链接器去链接的时候,选择其中一个

// A.hclass A {static inline int a = 2;  // 生成符号,可以取地址 , 并且支持类内初始化。
}

然后C++17以后,constexpr 的 static member变量默认 inline ,所以你可以这样写

// A.h class A {static constexpr int a = 3;  //生成符号,可以取地址,并且支持初始化}

 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...