1.存在语言:Static存在多个语言当中,Java、C++、C、C#等语言中都有该变量
面向过程:
1.静态变量在全局数据区分配内存
2.静态全局变量不能被其他文件引用,并且其他文件可以定义相同名字的变量,并不会发生冲突。全局变量默认是没有static修饰的,也就是说作用域为整个工程,在一个文件中定义,在另一个文件中可以通过extern或者include方式引用,而static修饰后的全局变量,作用域变为定义的整个文件,只在文件内部生效,无法被外部链接,所以其他文件可以定义相同名称的变量
3.静态局部变量即使函数return(结束),也不会被释放。因为static修饰变量是是放在全局数据区的,即使自定义函数结束,也不会被释放掉。所以常会用在第一次给static修饰局部变量一个初值,每次做算数操作(++ --)都会被保存下来(因为只会被初始化一次)。
4.静态函数不能被其他文件引用,作用域为本文件,其他文件可以定义相同名称的函数。
5.C语言中将静态函数称为内部函数,能被文件外部调用的函数称为外部函数
面向对象:
1.静态数据成员:
#include <iostream>
using namespace std;
class Myclass
{
public:
Myclass(int a, int b, int c);
void GetSum();
private:
int a;
int b;
int c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum = 0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
this->a = a;
this->b = b;
this->c = c;
Sum += a + b + c;
}
void Myclass::GetSum()
{
cout<<"Sum="<<Sum<<endl;
}
int main()
{
Myclass M(1, 2, 3);
M.GetSum();
Myclass N(4, 5, 6);
N.GetSum();
M.GetSum();
}
上面例子类内部的静态变量内存是共享的,所以无论是M.GetSum还是N.GetSum最后打印的都是15;
需要注意的是静态数据成员不能在类内部定义(因为初始化定义就需要分配内存),并且不能在头文件中对其进行定义,那样当多个源文件引用头文件会造成重复定义;
如果该例子中Sum为public成员的话,可以通过<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>引用静态数据成员;
静态数据成员主要用在多个对象都有同一项属性的时候,一方面能够节约内存(多个对象中静态数据成员公用分配内存),一个位置修改该静态数据成员,所有
对象的该成员数据均发生变化(不用一个个改,为整个类服务);
静态数据成员相对于全局变量一个是不存在名称冲突的问题,另一方面如果该成员是private成员,可以实现信息的隐藏;
2.静态成员函数
静态成员函数不能调用非静态数据成员变量和函数,只能调用其余静态成员函数和成员变量。但非静态成员函数可以调用它。因为静态成员函数与静态数据成员类似服务类而非对象,所以我们不光可以通过<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>两种方式来调用。