C++ static关键字的用法

本文深入探讨了静态全局变量、静态局部变量、静态函数及静态成员变量和函数的概念、作用域、初始化方式及其在C++中的应用。通过具体代码实例,详细解释了它们的特性与区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

静态全局变量

静态全局变量的定义:例如: static int value;
静态全局变量的初试化:未初始化的静态全局变量会自动初始化为0;也可以在定义的时候自己手动初试化。
静态全局变量的作用域:仅在当前文件有效,存储在静态存储区,在整个程序运行期间一直都存在。

#include <iostream>
using namespace std;
static int value;
void fun1() {
	value++;
	cout << "执行第一个函数后的值:" << value << endl;
}
void fun2() {
	value = value + 10;
	cout << "执行第二个函数后的值:" << value << endl;
}
int main()
{   //未初始化的静态全局变量会自动初始化为0
	cout << "没有初始化的静态成员变量的值:" << value << endl;
	fun1();
	fun2();
	//静态全局变量仅在当前文件内有效
	return 0;
}

输出:
在这里插入图片描述

静态局部变量

静态局部变量的定义:例如: static int value;
静态局部变量的初试化:未初始化的静态局部变量会自动初始化为0;也可以在定义的时候自己手动初试化。
内存位置:静态存储区域。
静态局部变量的作用域:作用域为局部作用域,当定义他的函数或者语句块结束的时候她的作用域结束。但是当局部静态变量离开作用域后并没有被销毁,任然存储在静态内存当中,只是我们不能对其进行访问,直到函数再次被调用,并且值保持不变。
代码:

#include <iostream>
using namespace std;
void fun() {
	static int value;//没有初始化的静态局部变量的值为0
	value++;
	cout << "调用" << value << "次value的值;" << value << endl;
}
int main()
{
	int value = 250;
	for (int i = 0;i < 10;i++)
	{
		fun();
	}
	cout << "主函数value的值:" << value << endl;
	return 0;
}

输出:
在这里插入图片描述

静态函数

静态函数定义声明:默认的都是extern :例如 static int show (int);
静态函数的作用域:只作用在本cpp文件,不能被其他文件所用,不会同其他cpp的同名函数起冲突。

静态成员变量

静态成员变量定义:例如:static int value;。
静态成员变量的初试化:静态成员变量不能通过初试化初始化列表初试化,必须初始化且只能在类外部进行初试化(不能在函数内部包括主函数)例如:int Base::value = 10;
静态成员变量的调用:①通过类名来调用 例如:Base::value;②通过对象来调用 例如:Base b;b.value;

静态成员函数

静态成员函数的定义:例如 static void show(){};
静态成语=员函数的调用:①静态成员函数只能调用静态成员,不能调用非静态的成员。②静态成员函数可以通过类名来调用也可以通过对象来调用。
代码:

#include <iostream>
using namespace std;
class Base {
public:
	static void show() //静态成员函数的定义
	{
		cout << "静态成员函数调用静态成员变量" << value << endl;//静态成员函数只能调用静态成员
	}
	static int value;//静态成员变量的定义
};
 int Base::value = 10;//静态成员变量在类外部初始化
int main()
{
	cout << "通过类名调用静态成员变量" << Base::value << endl;//通过类名调用静态成员变量
	Base::show();//通过类名调用静态成员函数
	Base B;
	cout << "通过对象名调用静态成员变量" << Base::value << endl;//通过对象名调用静态成员变量
	B.show();//通过对象调用静态成员函数
}

输出:
在这里插入图片描述
静态成员函数&&静态成员变量归纳总结
①静态成员是属于这类的,所有的对象共同所有。
②静态成员没有隐含的this指针。(重点!!!!!)
③如果静态成员是私有的则不能在类外直接访问,私有的静态成员变量可以在类外初始化,因为静态成员变量必须初始化。

所有的静态变量函数都是存放在静态区。
编译器:vs 2017

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值