C++ static关键字详解

背景

前段时间初步整理了C++中static的相关知识点,以此做个记录。

在C++中,static关键字是常见的修饰符。从大方向上static分为两类:
1.类或结构体外的static
2.类或结构体内的static
因此,本文内容的划分如下:
在这里插入图片描述
接下来会结合 静态全局变量/函数静态成员变量/函数静态局部变量 这三个部分,分别通过代码说明static的特点,以及它们的使用场景,最后拿出几个问题进行讨论(代码可以自己实践,为了突出重点,本文不放入程序运行结果截图)。

一、静态全局变量/函数

1、主要特点

静态全局变量/函数的主要特点就在于内部链接

那什么是“内部链接”属性呢?
“内部链接”就是一个名称对编译单元来说是局部的,在链接的时候其他编译单元无法链接到它。
(编译单元:源代码文件及其所包含的头文件的总和,经过预处理之后生成的文件。可以简单理解为一个.cpp文件)
通俗上说,就是静态全局变量/函数的的可见性被限制在定义它的文件中,程序中的其他文件无法访问。

用代码举例:
在Test1.cpp中我们定义一个全局变量value,并在MyClass.cpp中定义同名变量并打印它。

//Test1.cpp
#include <iostream>
using namespace std;
int value = 5;
//MyClass.cpp
#include <iostream>
using namespace std;

int value = 10;

int main()
{
   
   
	cout << value << endl;
	return 0;
}

以上代码会报重复定义的问题,这是因为我们不能定义同名的全局变量,因为全局变量的作用域是整个程序。
但如果我们在Test1.cpp中用static修饰value,这时候再运行,控制台会打印10。因为此时Test1.cpp中的value只在Test1.cpp可见,有点类似在类中定义了一个私有变量。(另一种解决全局变量命名冲突的方式,是将MyClass.cpp中的value定义更改为extern声明,即:extern int value;,意味着这里的value实际指向的是Test1.cpp中的value)
函数也是类似,可以用以上方式写个Function函数去验证。

2、静态全局变量的使用场景

静态全局变量是一种在文件范围内可见的变量。可以在以下场景中使用:
1、作用域控制。(如何限制全局变量的作用域,使其只在定义它的文件内可见?)
2、数据隐藏,实现模块私有数据。(如何在模块中存储数据而不影响其他模块?)
3、避免命名冲突。(如何避免在大型项目中全局变量名称冲突?)

二、静态成员变量/函数

1、主要特点

1.静态成员变量

静态成员变量的主要特点就是内存共享
也就是说如果有一个类,类中有一个静态成员变量,当我们不断创建这个类的实例,实际上它们的这个静态成员变量指向相同的内存。当其中一个类实例改变了这个变量的值,其他类实例的这个变量也会更改。
进一步讲,静态成员变量是属于类的,不是类实例的。
所以在讨论到生命周期的时候,普通成员变量会在对象创建时被初始化,在对象销毁时被销毁,与对象的生命周期相同;静态成员变量不依赖对象的创建,它在程序启动时被初始化,在程序结束时被销毁,与程序的生命周期相同。

通过代码举例:

//MyClass.cpp
#include <iostream>
using namespace
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ellie是个昵称

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值