之前经常遇到过static关键字的用法,并没有深入的研究其灵活的方法,今天在这里总结一下。C++的static关键字有两种用法:面向过程程序设计中的static关键字和面向对象程序设计中的static关键字。前者应用于普通变量和函数,不涉及类;后者主要说明static关键字在类中的作用。
一、面向过程设计的static关键字
1.静态变量
◆ 静态全局变量
在全局变量前加上static关键字,该变量就被定义成一个静态全局变量。静态全局变量的特点如下:
● 该变量在全局数据区分配内存;
● 未经初始化的静态全局变量会被程序自动初始化为0(假如为int类型);
● 静态全局变量在声明它的整个文件是可见的,而在文件外不可见;
● 静态全局变量保存在全局数据区,不会因为函数的推出而释放空间;
● 非静态全局变量可以在其他文件中使用,而静态全局变量不可以在定义它的文件之外使用;
● 静态全局变量不会影响其他文件中变量的定义,也就是说在其他文件中可以定义重名的变量,而不会冲突。
◆ 静态局部变量
在局部变量前加上static关键字,该变量就被定义为一个静态局部变量。静态局部变量的特点如下:
● 静态局部变量保存在全局数据区,而非静态局部变量保存在栈区;
● 静态局部变量在程序执行到该对象声明处首次初始化,之后调用不再被初始化,如下所示:
void fn();
void main()
{
fn();
fn();
fn();
}
void fn()
{
static int n=10;// 只执行一次
cout<<n<<endl;
n++;
}
● 如果静态局部变量未显式初始化,其初始化为0(假如为int类型);
● 静态局部变量一直保存到程序结束,但其作用域为定义它的函数体。
2.静态函数
在函数的返回类型前加上static关键字,函数即被定义为静态函数,定义静态函数的好处有:
● 静态函数只能在定义的文件中可见,不能被其他文件所用;
● 其他文件可以有相同的名字而不会引起冲突。
二、面向对象设计的static关键字(类中的static关键字)
1.静态数据成员
在类内的数据成员声明前加上static关键字,该数据成员就变为类的静态数据成员,静态数据成员的特点如下:
● 静态数据成员被所有的类的对象所共有,类定义对象时静态数据成员不会随着非静态数据成员而拷贝,所有的类的对象共用同一个地址的某一个静态数据成员的内存;
● 静态数据成员在定义时分配空间,它不能在类声明中定义,因为每一个类中的静态数据成员只分配一次空间,它一般定义在类的外部;
● 同其他非静态数据成员一样,静态数据成员遵循public,protected,private的访问规则;
● 静态数据成员初始化的方式为:<数据类型><类名>::<静态数据成员名>=<值>;
● 静态数据成员不管有没有产生类对象都可以访问,访问方式有两种:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>;
静态数据成员主要应用在各个类的对象有相同的某项属性的时候,比如银行存款中的利息,对于各个储户都是相同的。
2.静态成员函数
在类的成员函数声明前加上static关键字就成为了静态成员函数,静态成员函数的特点有:
● 类的成员函数之外的函数不能定义为静态的;
● 静态成员函数可以访问类内部的静态成员函数和静态数据变量,但是不能访问非静态成员函数和非静态数据变量,非静态成员函数和非静态数据变量可以访问静态函数和静态数据变量;
● 静态成员函数没有this指针的开销;
● 静态成员函数的调用和静态数据变量的调用方式相同。
参考:http://blog.csdn.net/he3913/archive/2008/09/18/2944731.aspx