C/C++——static关键字
Posted 一棵灬胡杨树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++——static关键字相关的知识,希望对你有一定的参考价值。
文章目录
前言
是这么回事,某日,一位好友问了我关于static关键字的几个问题,由于本人刚入门C++(学完了C语言),感觉对好友的问题回答的不系统,所以设想:如果面试官提出关于static关键字之类的问题,我该如何解答,并且解答的很有条理性,出于此目的在这篇blog下做一个初步总结。
一、Static关键字都有哪些用?
static关键字的作用初步总结为以下几点:
- 在函数体内,一个被声明为静态的变量在本函数体内,其值是不变的。
- 在一个模块内但不是函数体内,一个被声明为静态的变量可以被模块内的任意函数调用,但是不能被模块外的函数所调用,其本质就是在本模块内的全局变量。
- 在模块内,一个被声明为静态的函数只能被模块内的其他函数调用。说通俗一点就是这个函数被限制在声明它的这个模块当中。
下面我们来细说一下:
static修饰全局变量
我们都知道全局变量是存放在程序空间的数据区,加上static以后,其作用域发生了些许改变,被static修饰过后的变量,只能在被定义的文件内部使用。那么在你有多个文件的情况下,其他文件是不能访问你所定义的静态全局变量的。
static修饰局部变量
static修饰局部变量后,该变量就保存在数据区,变量就成为我们所说的静态变量,存储在数据区的变量的生命周期与程序相同,即在main函数之间初始化,在程序结束的时候销毁。
static修饰函数
static修饰函数后,静态函数只能在该文件下被调用,对于静态函数,其声明和定义需要放在同一个文件下。
二、当static面向对象的时候
静态数据成员
在C++中,如果某一个属性它被整个类所共享,不属于任何一个具体对象,我们就用static关键字来声明静态成员。
加上static关键字后的静态成员有什么特点呢?
- 静态数据成员保存在全局数据区,在定义的时候分配给存储空间,不在类中声明。
- 静态数据成员是类的一个成员,就算你定义了一万个类对象,静态数据成员的拷贝只有那么一个(这么看来,真节省空间啊)且对该类的所有对象都可见。说白了就是一个类中的一万个对象都可以对静态数据成员进行操作,而对于非静态成员,每个对象都有一份拷贝。
- 静态数据成员不属于任何对象,在没有类的实例划的时候,其作用域就可见,在没有对象的时候,也可以对静态数据成员进行操作。
- 静态数据成员和普通数据成员一样页遵循public\\protected\\private的访问规则
- 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
- 类的静态数据成员的访问方式有两种:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
咱们把全局变量和静态数据成员做个比较:
- 静态数据变量可以是私有成员,而全局变量不行。
- 静态数据成员没有进入程序的全局命名空间,因此不存在与程序中其它全局名字冲突的可能性。
静态成员函数
静态成员函数其实和静态数据成员差不多,静态成员函数属于整个类,不属于某一个特定的对象。
静态成员函数的特点:
- 静态成员函数没有this指针,这也就决定了它无法访问泪对象的非静态数据成员,也无法访问非静态成员函数,只能调用类的静态成员函数。
- 出现在类外的函数不能加static关键字。
- 非静态成员函数可以任意地访问静态成员函数和静态数据成员。
———————————————————————————
经过以上的学习,下面有些许问题:
Q1: 静态成员变量和静态成员函数的使用场景是什么?
答:说白了静态成员函数是为了处理静态成员变量而存在的。
Q2:静态成员函数有没有this指针?
答:当程序调用一个非静态成员函数的时候,编译器会把该对象的起始地址赋给成员函数的this指针。但是对于静态成员函数,它不属于某一个对象,是所有对象公用的,所以它没有this指针。
Q3:是怎么分配内存的?
答:static成员变量属于类,它是被存放在数据区域的,不属于某个具体的对象,而对象的内存是在堆上开辟的,即使创建多个对象,也只为该变量分配一次内存,所有对象使用的都是这份内存中的数据。
三、总结
上述是目前能够了解的一些知识点,如果后期还有新的知识,会不断更新。本文如果有任何错误还希望大佬指出,我会虚心改正。
以上是关于C/C++——static关键字的主要内容,如果未能解决你的问题,请参考以下文章
通过项目实践带你彻底搞懂C/C++编程中static与extern两关键字的使用