做为类成员
静态数据成员
同全局对象相比,使用静态数据成员有2个优势:
(1)静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
(2)可以实现信息隐藏。静态成员可以是private成员,而全局对象不能。
初始化:
因为静态数据成员不从属于任何一个具体对象,所以必须对它进行初始化,而且对它的初始化不能在构造函数中进行。
一般地,静态数据成员在该类定义之外被初始化。如同一个成员函数被定义在类定义之外一样,在这种定义中的静态成员的名字必须被其类名限定修饰。
#include <iostream.h>
class Sample
{
int n;
public:
Sample(int i) { n=i;}
void add() { s+=n; }
static int s;//定义
};
int Sample::s=0;//初始化
void main()
{
Sample a(2),b(5),c(8);
a.add();
cout<<"s="<<Sample::s<<endl;
b.add();
cout<<"s="<<Sample::s<<endl;
c.add();
cout<<"s="<<Sample::s<<endl;
}
运行结果:
s=2
s=7
s=15
静态成员函数
静态成员函数没有this指针。
做为非类成员
若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。
//file1.cpp
#include <iostream.h>
void fn();
extern int n;//声明
void main()
{
n=20;
cout<<n<<endl;
fn();
}
//file2.cpp
#include <iostream.h>
static int n;//n是一个静态全局变量,作用域仅在file2。
void fn()
{
n++;
cout<<n<<endl;
}
文件分别编译能通过,但连接时file1.cpp 中的变量n找不到定义,产生连接错误。去掉static int n前的static就可以了。
error LNK2001: unresolved external symbol "int n" (?n@@ 3HA )