7.6 类的静态成员
如果需要让一个成员在所有对象中都是一样的,可以将其声明为静态变量,如银行利率,是所有对象共享的
class Account {
public:
void calculate() { amount += amount * interestRate; }
static double rate() { return interestRate; }
static void rate(double);
private:
string owner;
double amount;
static double interestRate; // 静态成员变量
static double initRate(); // 静态成员函数
};
类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员相关的数据
- 静态成员函数没有
this
指针,所以不能声明为const
- 使用类名和作用域运算符访问静态成员
double r;
r = Account::rate(); // 使用作用域运算符访问静态成员
可以使用类的对象、引用或者指针来访问静态成员
Account ac1;
Account *ac2 = &ac1;
r = ac1.rate();
r = ac2->rate();
static
关键字只能出现在类内部的声明语句中
必须在类的外部定义和初始化每个静态成员
double Account::interestRate = initRate();
静态成员的类内初始化
可以为静态成员提供const
整数类型的类内初始值,要求静态成员必须是字面值常量类型的constexpr
class Account {
public:
static double rate() { return interestRate; }
static void rate(double);
private:
static constexpr int period = 30; // 常量表达式
double daily_tbl[period];
};
constexpr int Account::period; // 初始值在类的定义内提供
即使一个常量静态数据成员在类内部被初始化了,通常也应该在类的外部定义一下该成员
静态成员能用于某些场景,而普通成员不能
静态数据成员的类型可以就是它所属的类类型,而非静态成员只能声明成所属类的指针或引用
class Bar {
private:
static Bar mem1; // 正确
Bar *mem2; // 正确
Bar mem3; // Err
};
可以使用静态成员作为默认实参
class Screen {
public:
Screen& clear(char = bkground); // 使用静态成员作为实参
private:
static const char bkground;
};