使用类的static成员的优点:
(1)static成员在类的作用域中,避免与其他作用域的名字冲突。
(2)可以实施封装。static成员可以是私有成员,它遵循正常的公有、私有访问规则。
(3)static成员与特定类关联,更能清晰的显示出程序的意图。
class Account{public: // interface functions here void applyint() { amount += amount * interestRate; } static double rate() { return interestRate; } static void rate(double); // sets a new rateprivate: std::string owner; double amount; static double interestRate; static double initRate();};
static数据成员独立于该类的所有对象,它是与类进行关联的。Account的所有对象都共享一个单独的interestRate对象。
static成员可以通过类的作用域操作符,或者通过对象、引用、指针间接调用。
rate = account.rate();rate = accountPointer->rate();rate == Account::rate();
类的成员函数可以不用作用域操作符来使用类的static成员。
static成员在类的外部定义时,无需重复static关键字。
void Account::rate(double newRate){ interestRate = newRate;}
static成员函数没有this指针。
static成员函数不能声明为const。static成员函数不属于任何对象,所以它也不会修改对象的任何组成部分,因此也无需声明为const。
static成员函数不能声明为虚函数。
static数据成员必须在类定义体外部定义(在类定义体内部声明)。static数据成员不能通过类的构造函数初始化,而是在定义时初始化。
// define and initialize static class memberdouble Account::interestRate = initRate();
整形的const static成员比较特殊,可以在类的定义体内声明时进行初始化。
class Account{public: static double rate() { return interestRate; } static void rate(double); // sets a new rateprivate: static const int period = 30; double daily_tbl[period]; // ok: period is constant expression};
const static数据成员在类的定义体内初始化时,仍必须在类的定义体外进行定义,但不必再指定初始值。
// definition of static member with no initializer// the initial value is specified inside the class definitionconst int Account::period;
static数据成员的类型可以是该成员所属的类类型,普通成员则不可以。
class Bar{private: static Bar mem; // ok Bar mem1; // error}
static数据成员可用作默认实参。
class Screen{public: // bkground refers to the static member declared later in the class definition Screen& clear(char = bkground);private: static const char bkground = ‘#’;}
【学习资料】 《c++ primer》