C++静态变量

C语言中与"静态"相关的词包括,静态全局变量,静态局部变量和静态函数,关键词是static。C语言中的变量从作用域分,可以分为全局变量和局部变量;从存储方式分,可以分为静态存储方式和动态存储方式。

1. 静态全局变量

下面代码中的a属于全局变量,其特点是变量申请后存储在静态存储区,不会像函数内的局部变量,随着函数调用的结束而消失,全局变量会一直存储在静态区,直至所有程序执行完毕,才会销毁。此时如果有另外一个.c 文件引用了该文件,则应用该文件的.c文件,也可以访问这个全局变量。

cpp 复制代码
#include <stdio.h>
int a=0;
void func()
{
	printf("a=%d\n",a);
}

静态全局变量,是指在全局变量之前添加 static关键字,其特点和全局变量类似,除了下面一点:静态全局变量只能由本文件的函数进行访问,而无法被包含本文件的其他文件访问。

也就是 static int a;如果声明在全局,只是代表这个变量只能由本文件访问,而不能被其他文件访问。

要注意全局变量和静态全局变量都是在main()函数执行之前进行初始化的,利用这个特点可以在main函数执行之前执行一些代码,完成初始化工作。

2. 静态局部变量

静态局部变量,是指在局部区域(函数内部,而并非全局区域)定义的变量,但由于存储在静态区,所以并不会其值并不会随着函数调用的结束而消失,其特点是只能被初始化一次。比如下面的程序。我们在count函数内部声明了一个局部变量a,当声明的时候不赋值时,**静态变量的默认值是0;**之后多次调用count函数,a会一直存在,并且不会再调用static a语句,从而使得整个函数能够记录自己被调用了几次。

需要说明的是,对于普通的非静态变量,在vc中,只声明不赋值,其值默认为0,但是在gcc中,会给变量一个随机值,所以在声明变量的时候赋值,是一个好习惯。

cpp 复制代码
#include <stdio.h>
int count()
{
	static a;
	a++;
	return a;
}
int main()
{
	...
	count();
	...
	count();
	return 0;
}

3. 类内静态成员变量

类内静态成员变量,属于这个类,而不属于某个对象。所以静态成员变量可以直接通过 函数名::变量名 进行访问。类内的静态成员变量在类内只是进行申明工作,需要在类外重新赋值和定义。如果在类内直接定义 静态变量 的值,会编译报错。一种错误的示范如下:

cpp 复制代码
//A.h
class A
{
public:
	static int a =100;
};
//main.cpp
int main()
{
	std::cout<<"a="<<A::a<<std::endl;
}

4. 类继承时的静态成员变量

cpp 复制代码
#include <boost/filesystem.hpp>
#include <string>
#include <fstream>
#include <iostream>

class Parent {
public:
	Parent() = default;
	~Parent() = default;
	int counter() {
		static int a(0);
		return a++;
	}

	static int b;
};

int Parent::b = 0;

class Sun: public Parent {
public:
	Sun() = default;
	~Sun() = default;
};

class Daughter: public Parent {
public:
	Daughter() = default;
	~Daughter() = default;
};

int main() {
	Parent parent;
	Sun sun;
	Daughter daughter;

	std::cout << "Test of static variable in member function" << std::endl;
	std::cout << parent.counter() << std::endl;
	std::cout << sun.counter() << std::endl;
	std::cout << daughter.counter() << std::endl;

	std::cout << "Test of static member variable" << std::endl;
	std::cout << parent.b++ << std::endl;
	std::cout << sun.b++ << std::endl;
	std::cout << daughter.b++ << std::endl;

	return 0;
}

输出

bash 复制代码
Test of static variable in member function
0
1
2
Test of static member variable
0
1
2

参考文献

C/C++中静态变量_c++静态全局变量-CSDN博客

相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
‘’林花谢了春红‘’3 小时前
C++ list (链表)容器
c++·链表·list
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it4 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康4 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
机器视觉知识推荐、就业指导5 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
宅小海5 小时前
scala String
大数据·开发语言·scala