c++--类的静态成员
类的静态成员(static)
有时候,类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。
声明静态成员
可以使public/private的,类型可以使常量、引用、指针、类类型等。
class Account { public: void calculate(){amount+=amount*interestRate;} /*静态成员函数*/ static double rate(){return interestRate;} static void rate(double); private: std::string owner; double amount; /*静态数据成员*/ static double interestRate; static double initRate(); };
对象中不包含任何与静态数据成员有关的数据。因此,每个Account对象将包含两个数据成员:owner和amount。只存在一个interestRate成员,而且它被所有Account对象共享。
类似的,静态成员函数也不与任何对象绑定在一起,他们不包含this指针。作为结果,静态成员函数不能声明成const的,而且我们不能再static函数体内使用this指针。
使用类的静态成员
double r; r=Account::rate(); //使用作用域运算符访问静态成员 /********************************************/ Account ac1; Account *ac2=&ac1; r=ac1.rate(); //通过Accountd 的对象或引用访问 r=ac2->rate(); //通过指向Account 对象的指针访问
虽然静态成员不属于类的某个对象,但仍然可以使用类的对象、引用或者指针来访问静态成员。
成员函数不用通过作用域运算符就能直接使用静态成员(把静态成员看做类内成员就行)。
定义类静态成员(static关键字只出现在类内部声明)
静态成员函数:定义可内可外,外部不写static,外部必须有作用域运算符(和定义在外部的普通成员函数一样)
静态数据成员:定义在外,外部不写static,外部必须有作用域运算符
/*静态成员函数定义*/ void Acount::rate(double newRate) { interestRate=newRate; } /*静态数据成员定义并初始化*/ double Account::interestRate=initRate(); //注意作用域运算符不能忘
类似全局变量,静态数据成员定义在任何函数之外。一旦定义,就一直存在于程序的整个生命周期中。
静态成员的类内初始化??
通常,类的静态成员不应该在类的内部初始化。然而,可以为静态成员提供const整数类型的类内初始值,不过要求静态成员必须是字面值常量类型的constexpr.
class Account { ... private: static constexpr int period=30; double daily_tbl[period]; }; //一个不带初始值的静态成员的定义 constexpr int Account::period; //初始值在类的定义内提供
即使一个常量静态成员在类内部被初始哈了,通常情况下也应该在类的外部定义一下该成员。
静态成员能用于某些场景,而普通成员不能
1.静态数据成员可以使不完全类型。特别的,静态数据成员的类型可以使它所属的类类型。
2.可以使用静态数据成员作为默认实参。
class Screen { public: //bk表示一个在类中稍后定义的静态成员 Screen& clear(char=bk); private: static Screen mem; //不完全类型Screen static const char bk; //bk可作为默认实参 };