在成员的声明之前加上static关键字即可声明静态成员
静态成员的访问
- 使用作用域运算符直接访问
- 通过类的对象访问
Account::rate();
Account ac1;
Account *ac2 = &ac1;
r = ac1.rate();
r = ac2->rate();
静态成员函数不能访问类中的成员变量
静态成员函数不属于任何一个类对象,没有this指针,而非静态成员必须随类对象的产生而产生,所以静态成员函数"看不见"非静态成员,自然也就不能访问了
但是如果静态成员函数通过引用一个对象,是可以直接访问成员的,也体现了它成员函数的特权。
比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
定义静态成员
static关键字只出现在类内部的声明语句,在类的外部定义静态成员时,不能重复static关键字
在类的外部初始化静态成员
double Account::interestRate = initRate();
静态成员一旦被定义,就将一直存在于程序的整个生命周期中
类内初始化
通常情况下,类的静态成员不应该在类的内部初始化
如果静态成员是字面值类型的constexpr,则可以在类的内部为其提供const整数类型的类内初始值
class Account
{
private:
static constexpr int period = 30;
double daily_tbl[period];
};
即使一个常量静态数据成员在类内部被初始化了,通常情况下也应该在类的外部定义一下该成员。
与非静态成员的区别
- 可以是不完全类型
- 可以作为默认实参
我们知道在类内不能定义该类类型的成员,如
class Bar
{
Bar mem;
};
这是错误的,类成员必须是完全类型
但是静态成员无此限制
class Bar
{
static Bar mem1;
Bar *mem2;
};
作为默认实参
class Screen
{
public:
Screen& clear(char = bkground);
private:
static const char bkground;
};