《一》在c语言中static的作用:
- static修饰的变量和函数都只在本文件中访问,其他文件不可访问,用extern关键字也不可以
- static修饰局部变量:
(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
(4)它延长了局部变量的生命周期,它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
static的应用场景:
(1)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用static修饰
3考虑到数据的安全性:两个不同的文件中有相同的变量名或函数名时,可以用static修饰
《二》在c++中static的作用:
一:修饰成员变量
- 静态数据成员可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。
- 静态数据成员不依赖对象调用(所谓的不依赖指的就是我想用对象调用就用对象调用,不想用就不用)所以在public下它有两种访问方式:《1:<类对象名>.<静态数据成员名> 2:<类类型名>::<静态数据成员名>》
- 静态数据成员必须在类外初始化,因为静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义,它在类外的初始话方式:<数据类型><类名>::<静态数据成员名>=<值>
- 因为静态数据成员是在全局数据在程序刚开始时被区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;
- 静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
二:修饰成员方法
- 静态的成员方法也不依赖对象调用,所以它也有两种调用方式:(1:以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函:2:用作用域直接访问<类名>::<静态成员函数名>(<参数表>))
- 静态的成员方法中没有this指针,(this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的,但是,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针)
- 由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
- 出现在类体外的函数定义不能指定关键字static
由于静态成员方法没有this指针:
- 静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
- 普通成员函数可以任意地访问静态成员函数和静态数据成员;
- 静态成员函数不能访问普通成员函数和普通数据成员;