static:静态
静态可以分为很多种
这里以面向对象和面向过程来划分
面向对象
静态成员变量:
class Mystatic {
public:
int show_sta() { return sta; }
private:
int a, b, c;
static int sta; //静态成员变量的声明
};
int Mystatic::sta = 10; //静态成员变量的定义
静态成员变量于普通的成员变量来说有很多特点
1.静态成员变量为类内所有对象共享,不同于其他成员变量在每一个对象中都有一份拷贝,所有对象都可以操控静态成员函数。
举例:
#include <stdio.h>
void fn(void)
{
int n = 10;
printf("n=%d\n", n);
n++;
printf("n++=%d\n", n);
}
void fn_static(void)
{
static int n = 10;
printf("static n=%d\n", n);
n++;
printf("n++=%d\n", n);
}
int main(void)
{
fn();
printf("--------------------\n");
fn_static();
printf("--------------------\n");
fn();
printf("--------------------\n");
fn_static();
return 0;
}
-> % ./a.out
n=10
n++=11
--------------------
static n=10
n++=11
--------------------
n=10
n++=11
--------------------
static n=11
n++=12
2.因为静态成员变量是独立于对象外的,所以类为其单独开辟一块内存,所以静态成员变量必须初始化且必须在类外初始化(这里刚好与C++关于初始化的定义相结合----------------对于内置类型的变量若没有被显式初始化(我的理解就是初始化赋值),那么在定义于函数体之外的变量将被初始化为0),所以未在类外初始化赋值的静态成员变量将自动被赋值为0
3.静态成员变量存储在全局数据区,即程序消亡才被收回内存,且无需类的实例也可对其操作
4.静态成员变量于全局变量的功能其实很相似,但是静态成员变量还有一个全局变量没有的特性,那就是对其他文件不可见,也就是不会于其他文件的相同名字的函数或变量相冲突
静态成员函数:
和静态成员变量一样,静态成员函数是为类服务,而不是为对象服务的,所以静态成员函数可以调用静态成员变量,但是无法调用非静态成员变量,因为非静态成员变量是基于对象的,没有对象,非静态成员变量也不会分配内存,也就根本不存在
其次因为独立于对象,所以没有this指针
面向过程
静态全局变量
1.该变量在全局数据区分配内存;
2.未经初始化的静态全局变量会被程序自动初始化为0(自动变量的自动初始化值是随机的);
3.静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
静态局部变量
1.静态局部变量在全局数据区分配内存;
2.静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
3.静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;