1.静态局部对象

这种对象一旦创建,在程序结束前都不会被撤销,静态局部对象会一直保存它的值

size_t count_calls()
{
 static size_t ctr=0;//创建的静态局部对象,其值不会消失
 return ++ctr;
}
int main()
{
 for(size_t i=0;i!=10;++i)
  cout<<count_calls()<<endl;
 return 0;
}

2.static类成员:由于需要这样的全局对象,一般的全局对象会破坏封装,类可以定义类静态成员,static数据成员独立与类的任意对象而存在,是与类相关联的类也可以定义static成员函数,这种函数没有this指针,可以直接使用类的static成员,但不能直接使用非static成员

如何使用类的static成员,有一下几种种方式:

可以通过从类直接调用static成员,或者通过对象,引用,指向对象的指针

Account ac1;

Account *ac2=&ac1;

double rate;

rate=ac1.rate();

rate=ac2->rate();

rate=Account::rate();//注意rate()是static成员函数,但类的成员函数可以不是通过类作用域操作符直接使用类的static成员

static成员函数:

由于static成员函数没有this指针,因此不能声明成const的类型,另外也不能声明成虚函数????

static数据成员:static必须在类的定义体之外进行定义,不像普通的数据成员,static成员不是通过类构造函数进行初始化,而是在定义时进行初始化如:

double Account::interestRate=initRate();// 保证对象正好定义一次的最好的方法是将static数据成员包含在类的非内联成员函数定义的文件中,当出现类的名字时表示已经在类的定义域中了,可以使用类的私有成员了,但有一个例外对于const static成员,可以在类的定义域中进行初始化如:

private:

static const int preiod=30;

虽然在类的内部进行了初始化,但成员的定义还是必须的,成员的定义不必在指定初始值如:const int Account::period;

static数据成员可以是该成员所属的类类型,非static成员被限定声明为自身类对象的指针或引用,另外static const可以作为默认实参