C/C++中的static关键字
.静态成员变量(oop)
.静态成员函数(oop)
.静态全局变量
.静态局部变量
.静态函数
静态成员变量
在类内的变量的声明前加上关键字static,该数据成员就是类内的静态数据成员。
class Myclass
{
public:
Myclass(int a,int b,int c);
void GetSum();
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
特点:
1.静态成员变量是该类的所有对象所共有的。对于普通成员变量,每个类对象都有自己的一份拷贝。而静态成员变量一共就一份,无论这个类的对象被定义了多少个,静态成员变量只分配一次内存,由该类的所有对象共享访问,所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。
2.因为静态数据成员在全局数据区分配内存,由本类的所有对象共享,所以,它不属于特定的类对象,不占用对象的内存,而是在所有对象之外开辟内存,在没有产生类对象时其作用域就可见。因此,在没有类的实例存在时,静态成员变量就已经存在,我们可以操作它;
3.静态成员变量存储在全局数据区。static成员变量的内存空间既不是在声明类时分配,也不是在创建对象时分配,而是在初始化时分配。静态成员变量必须初始化,而且只能在类体外进行。否则,编译能通过,链接不能通过。
静态数据区的变量都有默认的初始值,而动态数据区(堆区、栈区)的变量默认是垃圾值。
4.static成员变量和普通static变量一样,编译时在静态数据区分配内存,到程序结束时才释放。这就意味着,static成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
5.静态数据成员初始化与一般数据成员初始化不同。可以不加static,但必须要有数据类型。被private、protected、public修饰的static成员变量都可以用这种方式初始化。格式:<数据类型><类名>::<静态数据成员名>=<值>
6.类的静态数据成员的变量访问形式1: <类对象名>.<静态数据成员名>
7.类的静态数据成员的变量访问形式2: <类类型名>::<静态数据成员名>,即静态成员不需要通过对象就能访问
8.静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
9.如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员
10.sizeof运算符不会计算静态成员变量。