先说一下C语言中的static,然后接着说C++中的static。
C语言中的static作用:
C语言中的static可以修饰变量或函数。
1.修饰变量:static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响,会延长它的生存周期。static修饰全局变量,全局变量具有外延性,被static修饰后,作用域仅限制在本文件,不能在其它文件中访问,即便是extern外部声明也不可以,他们都是程序运行结束后才释放。
2.修饰函数:加在函数定义或声明的前面,会限制函数作用域到文件作用域。
C++中static作用:
在C++中,关键字static除了继续保持上面的特性外,还可以用来修饰类的成员变量和成员函数,使之成为静态成员变量和静态成员函数,统称为静态成员。
静态数据成员 :
(1)静态数据成员可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。
(2)静态数据成员是在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态数据成员,即使不定义对象,也会为静态数据成员分配空间。
(3)静态数据成员可以被初始化,但是只能在类体外进行初始化(类内定义,类外初始化,type 类名::变量名=初值)。
(4)静态数据成员既可以通过对象名引用,也可以通过类名引用。
(5)static const :初始化只在声明的时候。
静态成员函数 :
(1)静态成员函数和静态数据成员一样,他们都属于类的静态成员,而不是对象成员。
(2)非静态成员函数有this指针,而静态成员函数没有this指针,所以不能访问非static数据成员以及非static成员函数。
。static 修饰成员函数,它的作用只有一个,用于管理static成员。
(3)静态成员函数主要用来访问静态数据成员而不能访问非静态成员。
需要注意的几点:
(1)sizeof不将静态成员变量的大小计算在内,例如:
class Test { private: int value; static int count; }; int Test::count=0; int main(int argc, char *argv[]) { Test t; cout<<"sizeof(Test) = "<<sizeof(Test)<<endl; }
运行结果:sizeof(Test) = 4,验证了sizeof运算符不会将静态成员变量的大小计算在内。另外,在使用静态变量成员的时候不进行初始化,链接的时候会出错。
(2)静态成员是属于类的,而不是属于某个对象的,即便没有一个实例,类的静态成员变量也已经存在了,因此静态变量
除了能够和普通成员一样通过对象访问外,还可以通过类名访问,访问形式为 类名::成员名。同时静态成员受到private、public等的限制,因此,在类外通过类名访问时,需要其访问权限为public。
(3)静态成员函数不能访问类的非静态成员
由于静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,因此在静态成员函数中访问非静态成员变量或者调用非静态成员函数就会出错。