本章通过问答方式明晰两个关键字及其作用。

Q1:对于int x;,不加extern关键字他就是个未赋初值的定义,但是如果加了static或者extern都可以表示这仅是一个声明吗?

A:不是的,具体情况如下:

int x; 是一个定义,它为 x 分配了存储空间,但没有显式地初始化。如果 x 是全局变量或静态变量,它会被隐式初始化为0。类内或函数内局部变量是一个随机数,尽量避免这种情况;

extern int x; 是一个声明,它告诉编译器 x 是一个整型变量,但并未为其分配存储空间。你需要在其他地方定义 x。

static int x; 可以是声明或定义,具体取决于上下文。如果它出现在函数内部,那么它是一个定义,并且 x 只能在该函数内部访问。如果它出现在全局范围内,那么它是一个定义,并且 x 只能在当前文件内访问。如果它出现在类内部,那么它是一个声明,并且你需要在类外定义并初始化这个静态成员变量。

Q2:static是可以用来标记本文件作用域的吗?

A: 是的,对于extern关键字,它可以通过extern int x;说明x在其他文件中已定义,请到其他地方寻找,但如果同时赋值,那么extern关键字的作用就被抵消了,如extern int x = 1等价于int x = 1;

而对于static int x;说明x仅在本文件中定义,其他文件无法访问。

Q3:为什么类内的static只是一个声明,定义和赋初值都需要在类外实现?

A:

1.根据primer第4版的解释,static局部对象必须遵守[确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化]的这一个原则。

2、同时,我们知道类内部的执行顺序并不是按行次序执行的,而是按对象调用执行的

3、以上两者决定了一个问题: 如果在类内定义,那么不建立对象时,静态数据成员无法初始化,或初始化时间太迟。(可能原因之一]

4、再者,静态成员的生命周期是,一经建立便会存在与整个程序的生命周期内。而静态数据成员即属于类、也不属于类的原因便在此,在类内定义,会使其完全成为该类中的成员,也就是说,当建立复数人该类对象时,会再次声明并定义这静态变量的位置,且名字空间和作用域相同下,导致重名问题。(可能原因之二)

5、因此static的成员需要独立于类作定义

Q4:函数内定义的static变量出了函数作用域后还会存在吗?

A:

是的,函数内定义的静态变量在函数执行完毕后仍然存在。静态变量在程序执行期间只被初始化一次,并且它们的生命周期与程序的生命周期相同。这意味着,即使函数执行完毕,静态变量仍然存在,并且在下一次调用该函数时,它们将保留上一次调用时的值。

例如,下面这个函数 count 使用了一个静态变量 x 来记录它被调用的次数:

void count() {
static int x = 0;
x++;
cout << x << endl;
}

每次调用 count 函数时,x 的值都会增加1,并输出当前的值。即使函数执行完毕,x 仍然存在,并且在下一次调用 count 函数时,它将保留上一次调用时的值。即static int x = 0;只会在第一次调用count()函数时起效一次。

详解C++中的extern与static关键字的更多相关文章

  1. 从缓存入门到并发编程三要素详解 Java中 volatile 、final 等关键字解析案例

    引入高速缓存概念 在计算机在执行程序时,以指令为单位来执行,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入. 由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这 ...

  2. 【转】详解C#中的反射

    原帖链接点这里:详解C#中的反射   反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...

  3. 详解Webwork中Action 调用的方法

    详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...

  4. 详解Java中的clone方法

    详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...

  5. 详解Python中re.sub--转载

    [背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一 ...

  6. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

  7. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

  8. 【转】详解JavaScript中的this

    ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...

  9. 深入详解SQL中的Null

    深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...

  10. java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")

    http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...

随机推荐

  1. testNG框架之我见

    testNG框架中会有一个xml文件夹,里面放xml文件,之后必须要在pom文件中配置 xml文件中有一个suite,在suite中可以配置parameter参数.test用例,还可以添加listen ...

  2. Idea项目构建时解决方法

    java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC overhead limit exceeded 整 ...

  3. 2003031120—廖威—Python数据分析五一假期作业

    项目 要求 课程班级博客链接 20级数据班(本) 这个作业要求链接 Python数据分析五一假期作业 博客名称 2003031120-廖威-Python数据分析五一假期作业 要求 每道题要有题目,代码 ...

  4. 【git报错】hint: Updates were rejected because the tip of your current branch is behind

    有时候作为非master权限的项目参与者 在push的时候会遇到这样的报错: hint: Updates were rejected because the tip of your current b ...

  5. SpringMvc配置和原理

    运行原理 DispatcherServlet通过HandlerMapping在MVC的容器中找到处理请求的Controller,将请求提交给Controller,Controller对象调用业务层接口 ...

  6. Pytorch GPU加速

    import torch import torch.nn.functional as F import torch import torch.nn as nn import torch.nn.func ...

  7. 初识MPC

    MPC调研报告 ​ 这是一篇关于MPC的调研报告,主要介绍了我对MPC领域的一些基础认识.全文按照这样的方式组织:第一节我介绍了什么是MPC以及MPC的起源:第二节介绍了MPC领域常用的一些符号和安全 ...

  8. springboot项目导出excel实现

    参见:https://blog.csdn.net/duli_0105/article/details/102809936

  9. 使用react-vite-antd,修改antd主题,报错 [vite] Internal server error: Inline JavaScript is not enabled. Is it set in your options? It is hacky way to make this function will be compiled preferentially by less

    一般报错 在官方文档中,没有关于vite中如何使用自定义主题的相关配置,经过查阅 1.安装less  yarn add less (已经安装了就不必再安装) 2.首先将App.css改成App.les ...

  10. 登录:ORA-12504:TNS:监听程序在CONNECT_DATA中未获得SERVICE_NAME

    问题描述:在用pl/sql登录soctt用户时,显示: 解决办法:在tnsnames.ora文件中添加(文件位置的查找方法见文章末尾) ORCL = (DESCRIPTION = (ADDRESS = ...