static关键字的作用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

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。
  • 静态成员变量只能初始化不能赋值
  • 静态成员变量可以实现多个对象之间的数据共享它是类的所有对象的共享成员它在内存中只占一份空间如果改变它的值则各对象中这个数据成员的值都被改变。
  • 静态成员变量存储在静态存储区和静态局部变量和全局变量一样它的生存期是全局的是在程序开始运行时被分配空间到程序结束之后才释放只要类中指定了静态成员变量即使不定义对象也会为静态成员变量分配空间。

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

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

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

2.静态成员函数

定义方式

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

 

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

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

特性

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

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6