分别讨论:
在C语言中:
从两方面讲:
1、static修饰变量时
①修饰的变量为局部变量时==》静态局部变量
a)生存周期延长,始终驻留在全局数据区,直到程序运行结束。
b)不会改变作用域,作用域为局部作用域
②修饰的变量为全局变量时==》全局静态变量
限制该变量的作用域为文件作用域,该变量在本文件内从定义开始到文件结束可见。不能被其他文件使用。
2、static修饰函数时 ==>静态函数
static加在函数定义或者申明前,限制函数作用域到文件作用域。
在C++中
新增了两种作用,修饰静态成员方法和静态成员变量。静态成员变量和静态成员方法统称为静态成员。
静态成员的特点:
①内存分配:在程序的全局数据区分配。
②初始化和定义:静态成员定义时要分配空间,所以不能在类申明中定义。
③静态成员函数和静态数据成员都没有this指针。
下面通过几个例子来加深一下印象:
1、sizeof不将静态成员变量的大小计算在内
class A
{
public:
A(int data):mb(data){}
~A(){}
private:
int mb;
static int ma;//静态成员变量的申明
};
//如果不进行初始化,会出现链接错误:error LNK2001: 无法解析的外部符号 "private: static int A::ma" (?ma@A@@0HA)
int A::ma;//静态成员变量在使用之前必须进行初始化,否则链接时会出现错误。
2、通过类名访问静态成员
因为静态成员属于整个类,不属于某一个对象。所以即使没有任何一个实例,类静态成员也已经存在了。在类实例化之前就已经分配空间了,所以对象可以访问静态成员,类名也可以访问。相对的,而类的非静态成员在类实例化之后才有内存空间,所以静因此静态成员函数在访问非静态成员函数时会出错!!!
class A
{
public:
A(int data):mb(data){}
~A(){}
static void show()//静态成员函数 在此函数中访问变量mb会出错!!!
{
cout<<"static void show()"<<endl;
}
public:
//静态成员依旧收到public,private,protected的限制
static int ma;//为了通过类名来访问成员变量,需要public权限
private:
int mb;
};
int A::ma=20;//使用之前必须进行初始化
int main()
{
cout<<A::ma<<endl;//即使时没有实例化对象,但是通过类名也能访问静态成员
cout<<a.ma<<endl;//通过对象来进行访问变量
A::show();//通过类名来访问静态成员方法
a.show();
return 0;
}