C/C++——static关键字


前言

是这么回事,某日,一位好友问了我关于static关键字的几个问题,由于本人刚入门C++(学完了C语言),感觉对好友的问题回答的不系统,所以设想:如果面试官提出关于static关键字之类的问题,我该如何解答,并且解答的很有条理性,出于此目的在这篇blog下做一个初步总结。

一、Static关键字都有哪些用?

static关键字的作用初步总结为以下几点:

  1. 在函数体内,一个被声明为静态的变量在本函数体内,其值是不变的。
  2. 在一个模块内但不是函数体内,一个被声明为静态的变量可以被模块内的任意函数调用,但是不能被模块外的函数所调用,其本质就是在本模块内的全局变量。
  3. 在模块内,一个被声明为静态的函数只能被模块内的其他函数调用。说通俗一点就是这个函数被限制在声明它的这个模块当中。

下面我们来细说一下:

static修饰全局变量

我们都知道全局变量是存放在程序空间的数据区,加上static以后,其作用域发生了些许改变,被static修饰过后的变量,只能在被定义的文件内部使用。那么在你有多个文件的情况下,其他文件是不能访问你所定义的静态全局变量的。

static修饰局部变量

static修饰局部变量后,该变量就保存在数据区,变量就成为我们所说的静态变量,存储在数据区的变量的生命周期与程序相同,即在main函数之间初始化,在程序结束的时候销毁。

static修饰函数

static修饰函数后,静态函数只能在该文件下被调用,对于静态函数,其声明和定义需要放在同一个文件下。


二、当static面向对象的时候

静态数据成员

在C++中,如果某一个属性它被整个类所共享,不属于任何一个具体对象,我们就用static关键字来声明静态成员。

加上static关键字后的静态成员有什么特点呢?

  1. 静态数据成员保存在全局数据区,在定义的时候分配给存储空间,不在类中声明。
  2. 静态数据成员是类的一个成员,就算你定义了一万个类对象,静态数据成员的拷贝只有那么一个(这么看来,真节省空间啊)且对该类的所有对象都可见。说白了就是一个类中的一万个对象都可以对静态数据成员进行操作,而对于非静态成员,每个对象都有一份拷贝。
  3. 静态数据成员不属于任何对象,在没有类的实例划的时候,其作用域就可见,在没有对象的时候,也可以对静态数据成员进行操作。
  4. 静态数据成员和普通数据成员一样页遵循public\protected\private的访问规则
  5. 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
  6. 类的静态数据成员的访问方式有两种:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

咱们把全局变量和静态数据成员做个比较:

  1. 静态数据变量可以是私有成员,而全局变量不行。
  2. 静态数据成员没有进入程序的全局命名空间,因此不存在与程序中其它全局名字冲突的可能性。

静态成员函数

静态成员函数其实和静态数据成员差不多,静态成员函数属于整个类,不属于某一个特定的对象。

静态成员函数的特点:

  1. 静态成员函数没有this指针,这也就决定了它无法访问泪对象的非静态数据成员,也无法访问非静态成员函数,只能调用类的静态成员函数。
  2. 出现在类外的函数不能加static关键字。
  3. 非静态成员函数可以任意地访问静态成员函数和静态数据成员。

———————————————————————————

经过以上的学习,下面有些许问题:

Q1: 静态成员变量和静态成员函数的使用场景是什么?

答:说白了静态成员函数是为了处理静态成员变量而存在的。

Q2:静态成员函数有没有this指针?

答:当程序调用一个非静态成员函数的时候,编译器会把该对象的起始地址赋给成员函数的this指针。但是对于静态成员函数,它不属于某一个对象,是所有对象公用的,所以它没有this指针。

Q3:是怎么分配内存的?

答:static成员变量属于类,它是被存放在数据区域的,不属于某个具体的对象,而对象的内存是在堆上开辟的,即使创建多个对象,也只为该变量分配一次内存,所有对象使用的都是这份内存中的数据。

三、总结

上述是目前能够了解的一些知识点,如果后期还有新的知识,会不断更新。本文如果有任何错误还希望大佬指出,我会虚心改正。

猜你喜欢

转载自blog.csdn.net/xhuyang111/article/details/115176130