简说static关键字

tech2022-09-29  74

今天在面试的时候面试官问到了static把我给问懵了,发现自己的知识储备真的不够。

变量

1、局部变量

普通的局部变量储存在进程的栈空间,使用完之后会立即被释放,即在函数运行完毕之后其值变回消失。

但是static变量在初始化的时候便会存入静态存储区中,就算没有赋初值也会默认设置为0,即使函数返回其值不会发生改变。在下一次进入到该函数的时候,定义static局变量的语句就等同于失效了,比如说static变量a = 1进入到函数中,执行语句static a = 0; 这样a的值还是保持为1,并不会初始化为0。

这一点特性和全局变量相似,但是static修饰的局部变量其作用域在定义的函数内。大大增加了程序的模块化。

2、全局变量

普通的全局变量对于整个工程文件时可见的,可以通过extern关键字对其进行调用,所以在其他的工程文件中不能定义一个与其同名的变量,(重复定义警告)。

但是使用static对其进行修饰,该变量的作用域就会被限制在该.c文件中,在其工程的其他文件中可以定义一个与其同名变量。两者互不影响。

函数

普通函数在工程内可以使用头文件的方式,在其他的.c文件调用。

static修饰的函数类似于全局变量,其作用域限定在该.c文件中其他的文件不可调用该函数。

1、静态数据成员

静态数据成员可以作为成员函数的默认形参,而普通数据成员则不可以静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用 例子: class Test{ public: //静态数据成员 static Test a;//正确 Test b;//报错 Test *pTest;//正确 Test &m_Test;//正确 static Test *pStaticObject;//正确 }; 静态数据成员在const函数中可以修改,而普通的数据成员是不能修改的。

2、静态成员函数

静态成员函数不能调用非静态成员函数,但是非静态成员函数可以调用静态成员函数。静态成员函数没有this指针,即他不能使用修饰符如const静态成员函数属于整个类,在任意一个对象以及派生的对象都可以使用。
最新回复(0)