static

132 阅读3分钟

static修饰主要有 静态变量 静态类的成员

静态变量

静态局部变量

  • 数据存放在全局数据区
  • 当程序运行到该对象的声明时被初始化
  • 静态局部变量始终存放在全局数据区,直到程序结束,其作用域为其局部作用域

类中的静态变量

  1. 静态成员变量是该类的所有对象所共有的。对于普通成员变量,每个类对象都有自己的一份拷贝。而静态成员变量一共就一份,无论这个类的对象被定义了多少个,静态成员变量只分配一次内存,由该类的所有对象共享访问。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
  2. 静态成员变量存储在全局数据区。当在初始化时(编译)分配内存,因此要使用必须进行初始化。 初始化必须在类外进行,如果初始化不赋值那么就是默认值0。静态数据区的变量都有默认的初始值,而动态数据区(堆区、栈区)的变量默认是垃圾值。
  3. 类的静态成员变量访问形式1:<类对象名>.<静态数据成员名>
    类的静态成员变量访问形式2:<类类型名>::<静态数据成员名>,也即,静态成员不需要通过对象就能访问。
  4. sizeof 运算符不会计算 静态成员变量。
class CMyclass{
    int n;
    static int s;
};    //则sizeof(CMyclass)等于4

静态变量相对于全局变量的优点

  • 没有进入全局命名空间,不会与程序中其他全局命名空间起冲突
  • 可以实现信息隐藏。静态数据成员可以用private修饰,全局变量不可以

全局静态变量

  • 内存分配在全局数据区
  • 静态全局变量不能被其他文件使用,其他文件可以定义相同的变量名字不会起冲突,即使使用extern进行声明也不行

静态函数

面向过程的静态函数

该函数只能在声明他的文件可见,其他文件不可见
相对于其他函数的优点 :

  • 函数不能被其他文件使用

类的静态函数

  • 与普通函数相比,静态成员函数属于类本身,而不作用于对象,因此它不具有this指针。正因为它没有指向某一个对象,所以它无法访问属于类对象的非静态成员变量和非静态成员函数,它只能调用其余的静态成员函数和静态成员变量。 从另一个角度来看,由于静态成员函数和静态成员变量在类实例化之前就已经存在可以访问,而此时非静态成员还是不存在的,因此静态成员不能访问非静态成员。
  • 调用静态成员函数,两种方式:
    1.通过成员访问操作符(.)和(->),也即通过类对象或指向类对象的指针调用静态成员函数。
    2.直接通过类来调用静态成员函数。<类名>::<静态成员函数名>(<参数表>)。也即,静态成员不需要通过对象就能访问。