1.什么是static关键字
static中文意思是静态的,是C/C++中常见的一个关键字。它一般用于修饰变量(局部变量/全局变量)和函数。
对于变量来说,static关键字用来控制变量的存储方式,作用范围和生命周期。
下面我们分别在C语言和C++中讨论static的用法。
2.static在C语言中的运用
2.1static修饰局部变量
2.1.1static修饰的变量只初始化一次
1.在函数中声明变量时,static修饰的变量只初始化一次。
2.static修饰局部变量时,会改变局部变量的存储位置(静态区),所以该局部变量的生命周期变长(在程序结束时才会销毁)。
原因:static修饰了局部变量x,fun函数每次调用完毕,x不销毁,再次调用fun时,x保持原有数值运行。
总结:static关键字修饰局部变量不改变作用域,但是延长生命周期(存在静态区),进程结束时才会销毁。
2.1.2static修饰局部变量默认初始化为0
和全局变量一样,static修饰局部变量默认初始化为0。
因为static修饰的局部变量存在静态区,全局变量也存在静态区,所以它们有一些相似的特性。
static修饰的局部变量和全局变量的区别:前者只是局部可见,后者全局可见。
2.2static修饰全局变量和函数
1.首先说一下全局变量的作用域非常广泛,只要在一个源文件中定义后,这个程序中的所有源文件、对象以及函数都可以调用,生命周期更是贯穿整个程序。文件中的全局变量想要被另一个文件使用时就需要进行外部声明(以下用extern关键字进行声明)。
2.static修饰全局变量和函数时,会改变全局变量和函数的链接属性-------变为只能在内部链接,从而使得全局变量的作用域变小。
总结:
1. 全局变量和函数本身是具有外部链接属性的,在test.cpp文件中定义的全局变量和函数,在main.cpp文件中可以通过【链接】来使用;
2. 但如果全局变量被static修饰,那这个外部链接属性就会被修改成内部链接属性,此时这个全局变量就只能在自己的源文件中使用;
3.static在C++中的运用
C++是兼容C的,所以C中的static在C++中依然适用。本小结主要介绍static在类中的用途。
类中被static修饰的成员分为两类:1.静态成员变量。2.静态成员函数。
注意:静态成员函数一定要在类外初始化。
重点概念:
1.静态成员为所有类对象所共享,不属于某个具体的实例。
2.静态成员变量必须在类外定义,定义时不添加static关键字。
3.静态成员函数没有隐含的this指针,不能访问任何非静态成员。
4.静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值。
示例一:
这个例子说明静态成员变量和函数为所有类对象所共享,不属于某个具体的实例。它们不参与类大小的计算。
示例二:
这个例子说明静态成员函数一定要在类外初始化。
示例三:
这个例子说明静态成员函数不可以访问非静态成员变量,因为它没有this指针。
3.1公有静态成员变量的访问方式
1.通过类对象.静态成员来访问。
2.通过类名::静态成员来访问。
3.通过匿名对象突破类域进行访问。
3.2私有静态成员变量的访问方式
1.通过类对象.静态成员函数来访问。
2.通过类名::静态成员函数来访问。
3.通过匿名对象调用静态成员函数来访问。
由此可见静态成员函数也是这三种访问方式,但是非静态成员函数不可以通过类名::静态成员函数来访问。
静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值。
3.3小问题
静态成员函数可以访问非静态成员函数嘛:
答:不可以,因为没有this指针。
非静态成员函数可以调用静态成员函数嘛:
答:可以,静态成员为所有类所共享,不受访问限制。