IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++中静态变量 -> 正文阅读

[C++知识库]C/C++中静态变量


C语言中与“静态”相关的词包括,静态全局变量,静态局部变量和静态函数,关键词是static。C语言中的变量从作用域分,可以分为全局变量和局部变量;从存储方式分,可以分为静态存储方式和动态存储方式。
需要区分的概念是,全局变量是存储在静态存储区的,所谓的静态存储区是一个进程所分配内存的.bss和.data段,但全局变量不是并不是静态变量。

1. 静态全局变量

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

	#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中,会给变量一个随机值,所以在声明变量的时候赋值,是一个好习惯。

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

3. 静态函数

静态函数,即是函数前面添加由static关键字的函数,主要表示此函数只能被本文件内的函数调用,而不能被其他文件使用,和静态存储区无关。

4.类内静态成员变量

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

#include <iostream>
using namespace std;
class A

{
public:
	static int a =100;
};
int main()
{
	cout<<"a="<<A::a<<endl;
}

错误如下:
error: ISO C++ forbids in-class initialization of non-const static member ‘A::a’
7 | static int a =100;
类内静态变量的访问权限也分为 public, protect,和private多种。

5. 类内静态局部变量

在类内的成员函数中,定义静态变量,其含义和静态局部变量类似。在实际使用中,除了之前和静态局部变量的使用之外,结合设计模式的相关知识,可以用于单例模式。

6.类内静态函数

类内的静态成员函数属于某个类,而不是某个对象。所以调用静态函数,直接使用 类名::函数名即可进行调用。
C++的普通成员函数会默认传入this指针,所以C++的成员函数能够直接访问类内的非静态成员变量,而类内的静态成员函数没有传入this指针,所以静态成员函数无法访问类的非静态成员变量。可以这么理解,因为静态函数的调用是通过类,而不是对象,所以类内的成员变量都没有被初始化和赋值,所以静态函数访问其也并没有意义。
静态成员函数无法被virtual和const修饰。原因, const是用来修饰this指针的,代表this指针指向的内容在本函数中不会被改变。virtual用于创建虚函数,来区分哪个对象调用了该函数,而静态函数是通过类来进行调用的。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:48:36  更:2022-01-11 23:49:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:03:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码