static关键字的作用

目录

C语言中static关键字的作用

1.static关键字修饰局部变量

2.static关键字修饰全局变量

3.static关键字修饰函数

在C++中static关键的作用

1.静态成员变量

2.静态成员函数


C语言中static关键字的作用

1.static关键字修饰局部变量

概念: static修饰局部变量就使之成为静态局部变量。

作用域: 静态局部变量的作用域并未发生变化,在其所在的局部范围,也就是其所定义的代码块内部。

生存期: 静态局部变量实际上是特殊的全局变量,它们位于相同的内存区域,内存分为栈区,堆区,静态存储区。静态局部变量和全局变量都位于静态存储区,因此静态局部变量的生存期与全局变量一样是全局的,随程序启动而生,随程序结束而消亡。

特点: 静态局部变量的初始化只会在第一次进入这个函数时进行初始化,当离开函数的时候,静态局部变量会继续存在并保持其值,以后进入函数时会保持上次离开时的值。

2.static关键字修饰全局变量

因为全局变量具有外部连接属性,外部任意一个源文件想要使用其他源文件中的全局变量,只需要先使用extern关键字进行声明,然后就可以使用,也就是说某个源文件的全局变量可以在整个项目中被任意的一个源文件使用,所以全局变量的作用域是整个工程。当一个全局变量被static所修饰的时候,它就称为了静态全局变量,静态全局变量具有内部连接属性,使得这个静态全局变量只能在自己所在的编译单元中被使用,而不能被其它编译单元所使用,否则会出现链接性错误。

static修饰变量时,如果变量没有被初始化会被自动初始化为0

3.static关键字修饰函数

函数也是具有外部连接属性的,编译器每次编译只处理一个编译单元,当某个编译单元需要使用其他编译单元中的函数,只需要声明该函数(或者包含该函数声明所在的头文件)然后就可以使用,当一个函数被static所修饰的时候,这个函数的外部连接属性就变成了内部连接属性,也就成为了静态函数,使得这个静态函数只能在自己所在的编译单元中被使用,而不能被其它编译单元所使用,否则会出现链接性错误。

通常我们在头文件中声明一个函数,然后在源文件中去定义该函数,在定义某函数时需要将某一段代码封装成为另一个函数以达到复用的目的,这段代码所封装成的函数只是为了定义那个函数所使用,不会在其它源文件中使用,所以将其声明为static。

在C++中static关键字的作用

static关键字修饰类中成员使之成为静态成员,静态成员的特点如下:

  • 静态成员也是类的成员,受public、protected、private 访问限定符的限制。
  • 静态成员为所有类对象所共享,不属于某个具体对象,它是属于类的,只有一份内存,类静态成员可用类名::静态成员或者对象.静态成员来访问。类名访问,肯定是从类外访问,那么类外访问的话,就要求静态成员是公有属性,可以用类名访问这一点也说明:静态成员变量肯定不是属于对象的,如果是属于对象,那么就不能用类名访问了。

静态成员包括静态成员变量和静态成员函数,static关键字修饰成员变量使之成为静态成员变量,static关键字修饰成员函数使之成为静态成员函数。

1.静态成员变量

特性:

  • 在对象的构造函数中不能对静态成员变量进行初始化,因为静态成员变量不属于单个对象,不需要对象去初始化。静态成员变量在类中加static声明,在类外进行初始化定义,初始化定义时不添加static关键字。若未对静态成员变量进行初始化操作,编译器会自动将其初始化为0。
  • 静态成员变量只能初始化,不能赋值
  • 静态成员变量可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。
  • 静态成员变量存储在静态存储区,和静态局部变量和全局变量一样,它的生存期是全局的,是在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态成员变量,即使不定义对象,也会为静态成员变量分配空间。

如图,如果在类中进行初始化定义,编译器就会报错

static关键字的作用_第1张图片

改成如下,类中声明,类外定义就没有问题了

static关键字的作用_第2张图片

如果给静态成员变量赋值,编译器就会报错

static关键字的作用_第3张图片

2.静态成员函数

定义方式:

  1. 类中声明,类外定义
  2. 类中定义

class ClassName
{
public:
    static Type fun(){}//在类中定义
    static Type fun2();//类中声明
};
Type ClassName::fun2(){}//在类外定义

在类外定义的时候不需要再加上static

特性:

静态成员函数没有隐藏的this指针,不能访问任何非静态成员。

没有隐藏的this指针是因为可以通过类名直接去访问函数,那么过程中间不存在对象,this指针就没有对象去指向了,为了避免这种情况的发生,索性就静态函数中就不要this指针了,如果通过对象去调用静态成员函数,虽然可以正确调到,但是this指针也没了。

不能访问任何非静态成员。原因之一是因为不存在this指针,因此你无法在静态成员函数中通过.操作符和->操作符来访问属于某个具体对象的非静态成员。静态成员函数只能访问静态成员。普通成员函数可以访问普通成员,也可以访问静态成员。

你可能感兴趣的:(C/C++,c++,c语言,开发语言)