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

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. Python Boolean类型 判断

    and 判断非Boolean类型数据会自动转换类型 "A" and "B" → "B" 因为表达式 A 和 B都为True所以返回 &quo ...

  2. Delphi中IdHttp调用接口,返回值乱码

    --------开发环境是Delphi XE10-------- 这里要说的是BUG问题, var respStream : TStringStream; respStream.DataString有 ...

  3. 9.22 2020 实验 3:Mininet 实验——测量路径的损耗率

    一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定:初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率.   二.实验任务 ...

  4. python学习记录(五)-文件操作

    open()参数说明 ''' 参数1:路径 ./当前目录 ../上一级目录 参数2: 基础模式:w r x a w:写入,不存在则创建,存在则打开,清空文件内容,光标指向最前面 r:只读,不存在则报错 ...

  5. 【前端样式】关于Element-plus 菜单 unique-opened不生效的问题

    需要保证el-sub-menu 的唯一性,即index得写在el-sub-menu上,否则 unique-opened 属性不生效.

  6. 有关C++数据结构

    1.临时变量的访问速度远远大于成员变量. 2.C++中唯一一种函数返回值可以做左值的就是引用,本质上也是指针. 3.成员函数末尾加const,表示只读成员函数,不能修改成员变量的值.只读成员函数仅仅用 ...

  7. 获取UndeclaredThrowableException异常信息

    一.堆栈错误信息如下,要获取红框里的message 说明:ValidationException为自定义异常,继承自Exception 二.代码如下

  8. Leecode 206.反转链表(Java)

      想法: 1.设链表长度为n,如5,头节点head,则最后一个元素位置为head-1.      错误,发现行不通,此为链表非数组,存储位置不连续   2.设两个指针p,q,让p,q指向head,再 ...

  9. [UnityAI]行为树的中断机制

    参考链接: https://www.cnblogs.com/01zxs/p/9863715.html https://blog.csdn.net/AcmHonor/article/details/12 ...

  10. MarkDown基本用法学习

    一级标题 语法:# +内容 二级标题1 语法:## +内容 二级标题2 三级标题 语法:### +内容 字体 加粗 语法:** +内容+ **(中间无空格) 效果:粗体 斜体 语法 * +内容+ *( ...