static局部变量
static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化
这种对象一旦被创建,在程序结束前不会被撤销。在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值。
#include<iostream> #include<string> #include<assert.h> using namespace std; 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; getchar(); return 0; }
本文地址:http://www.cnblogs.com/archimedes/p/cpp-static.html,转载请注明源地址。
static类成员
全局对象会破坏封装,对象需要支持特定类抽象的实现,类可以定义类静态成员,不像普通的数据成员,static数据成员独立于该类的任意对象而存在。
1、使用类的static成员的优点:
(1)static成员的名字在类的作用域中,因此可以避免与其他类的成员或全局对象的名字冲突;
(2)可以实施封装。static成员可以是私有成员,而全局对象不是;
(3)通过阅读程序容易看出static成员是与特定类关联的。
2、定义static成员
考虑一个银行账户类,每个账户的利率总是相同的,代码如下:
class Account{ public: void applyint() {amount+=amount*interestRate;} static double rate() {return interestRate;} static void rate(double); private: string owner; double amount; static double interestRate; static double initRate(); };
3、使用类的static成员
可以通过作用于操作符从类直接调用static成员,或者通过对象、引用或指向该类类型对象的指针间接调用
Account ac1; Account *ac2=&ac1; double rate; rate=ac1.rate(); rate=ac2->rate(); rate=Account::rate();
像其他的成员函数一样,类成员函数可以不用作用域操作符来引用类的static成员:
class Account{ public: void applyint(){ amount+=amount*interestRate;} };
static成员函数
类的成员函数定义在类的外面不需要重复static关键字
static函数没有this指针
static成员函数不能被声明为const,也不能声明为虚函数
static数据成员
static数据成员可以声明为任意类型,必须在类定义体的外部定义(正好一次),static数据成员不能通过类的构造函数初始化
1、特殊的整型const static成员
一般而言,类的static成员,不能在类的定义体中初始化,通常在定义时就初始化,但是一个例外是:只要初始化式是一个常量表达式,整型const static数据成员就可以在类的定义体中进行初始化:
class Account{ public: static double rate() {return interestRate;} static void rate(double); private: static const int period=30; double daily_tbl[period]; static double interestRate; };
2、static成员不是类对象的组成部分
static数据成员可以用作默认实参:
class Screen { public: Screen clear(char=bkground); private: static const char bkground='#'; };
非static成员不能用作默认的参数,因为它们的值不能独立于所属的对象而使用