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可以作为默认实参