C语言static关键字:
为什么要使用static——静态:
1、对于静态全局变量而言,存储在数据段,目的是限制其他源文件(.c文件)的访问权限
2、对于静态局部变量而言,存储在数据段,经过证实存储在数据段的静态存储区,生存周期维持在整个源文件内(函数结束不会立即销毁,会保存在数据段的静态存储区,可以改变值)
(记住,静态局部变量依旧是局部变量,只不过拥有了部分全局变量不死的特性!)
#include<stdio.h>
int fun(int x)
{
static int a = 3; //static 修饰的a —— 静态局部变量
// 存储在数据段内,其值可以修改,最大的变化就是改变了生存周期
x += a++; //先赋值3,完成x = x +3 ,后面才自加
printf("a = %d\n",a);
printf("x = %d\n",x);
return x; //函数结束临时变量x被释放 x 依旧为 x = 2
}
void main()
{
int x = 2, sum;
sum = fun(x);
//sum = sum + fun(x);
printf("sum = %d\n", sum);
}
static关键字的作用
(1)定义静态变量
1、定义静态变量(全局静态和局部静态):在变量类型前加上static关键字,变量即被定义为静态变量,静态变量只能在本源文件中使用。初始化的静态变量会在data段分配内存,未初始化的静态变量会在bss段分配内存。直到程序结束,静态变量始终会维持前值。只不过全局静态变量和局部静态变量的作用域不一样。
2、在c++中,static关键字可以用于定义类中的静态成员变量:使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏在类的内部。类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间。
(2)定义静态函数
1、定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数,静态函数只能在本源文件中使用;
2、在c++中,static关键字可以用于定义类中的静态成员函数:与静态成员变量类似,类里面同样可以定义静态成员函数。只需要在函数前加上关键字static即可。如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间。
当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针(划重点,面试题常考)。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。
补充:类中static修饰的静态成员函数没有this指针,不属于任何一个对象,无法后接对象地址
静态成员函数只能访问 ------> 静态成员函数(不属于对象) 静态成员变量 类以外的函数和变量
不能访问 ------> 非静态的成员函数(属于对象)
非静态成员函数 静态非静态(函数、变量)都可以访问
理解1:静态成员函数所需内存在程序执行前就分配好了,非静态成员必须要等到这个类在堆或者栈上分了内存才能用,所以如果静态成员函数访问非静态,可能非静态成员还没有内存。
理解2:静态成员函数(变量)属于类的公有资源,非静态成员函数(变量)一般属于对象的私有资源,私有可以访问公有,但公有一般不可访问私有(主要指私有函数(非静态成员函数),因为没有this指针)(某些条件下可以做到间接访问)