C++ 中 Static 关键字的作用

文章介绍了静态变量在C++中的使用,包括静态成员变量的共享内存特性,以及静态局部变量的作用范围和生命周期。通过实例展示了如何利用static控制变量的可见性和不变性。
摘要由CSDN通过智能技术生成

Static 能够被用在一个类或者结构体的内部或者外部。
如果用在外部的话,意味着被你声明成 static 的变量只能作用于该定义的 Translation Unit.

如果用在内部的话,则意味着该 static 变量将会共享该类所有实例的内存空间。即在所有该类的实例中,该变量将只会有一个实例。如果某一个类的实例改变了该变量的值,则所有的类实例中该变量的值都将被改变。

Static 用在类或者结构体的内部

#include <iostream>

struct Entity
{
	static int x, y;

	static void print()
	{
		std::cout << x << ", " << y << std::endl;
	}
};

int Entity::x;
int Entity::y;

int main()
{
	Entity e;
	Entity::x = 2;
	Entity::y= 3;

	Entity e1;
	Entity::x = 5;
	Entity::y = 8;

	e.print();
	e1.print();
}

那鉴于 Entity 中所有的变量以及函数都是 static 的,所以我们根本不需要实例化。 那代码可以修改为:

int main()
{
	Entity::x = 2;
	Entity::y= 3;

	Entity::x = 5;
	Entity::y = 8;

    Entity::print();
}

Static 作用于局部(Local)
首先,定义一个变量我们可以规定了它的作用范围以及生命周期。作用范围意味着哪里可以访问该变量,而生命周期则指该变量会在内存空间中保留多久。Local Static 即表示创建一个生命周期为整个程序,但是作用范围为当前声明该变量的函数,其他的函数并不能访问它 (作用范围可以自己定义)。

依然用例子说明:

#include <iostream>

void Function()
{
	int i = 0;
	i++;
	std::cout << i << std::endl;
}

int main()
{
	for (size_t i = 0; i < 5; i++)
	{
		Function();
	}
	std::cin.get();
}

该函数的输出结果很显然为 1,1,1,1,1。

但是如果将 i 定义为 static 呢?

#include <iostream>

void Function()
{
	static int i = 0;
	i++;
	std::cout << i << std::endl;
}

int main()
{
	for (size_t i = 0; i < 5; i++)
	{
		Function();
	}
	std::cin.get();
}

输出结果为 1,2,3,4,5. 这时我们想要的结果。

#include <iostream>

int i = 0;

void Function()
{
	i++;
	std::cout << i << std::endl;
}

int main()
{
	for (size_t i = 0; i < 5; i++)
	{
		Function();
	}
	std::cin.get();
}

但此时该变量可以随时在外部被改变。

#include <iostream>

int i = 0;

void Function()
{
	i++;
	std::cout << i << std::endl;
}

int main()
{
	Function();
	i = 10;
	for (size_t i = 1; i < 5; i++)
	{
		Function();
	}
	std::cin.get();
}

输出结果此时为1,11,12,13,14.

如果你并不想要变量 i 的值能够在任意地方被修改,则可以将 i 在函数内部声明为static。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值