玩命加载中 . . .

7.6-类的静态成员


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;
};

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录