Static关键字通常在类的成员函数和成员变量使用。
声明:
注意:静态成员函数和变量不属于类的任一对象,但可通过对象、指针或引用进行访问,不能声明成 const,对于静态成员变量,成员函数可直接调用
class Account{
public:
void calculate(){amount += amount *interestRate;}
private:
static double interestRate;
}
定义:
注意:一个静态成员只能定义一次,一般来说,静态成员只能在类外定义,类外不可重复static关键字,static只能出现在类的内部声明里,类外定义时需添加类作用域
我们可以通过在类外定义静态成员时访问类的私有成员
class Account{
public:
void calculate(){amount += amount *interestRate;}
private:
static double interestRate;
static double initRate()
}
double Account::interestRate=initRate();
特殊情况下,我们可以为静态成员赋予const整数类型的类内初始值,但要求在静态成员必须是字面值常量类型的constexper。
class Account{
public:
void calculate(){amount += amount *interestRate;}
private:
static constexper int interestRate=30;//interestRate是常量表达式
}
constexper int Account::interestRate; //初始值在类内定义
若想interestRate初始可被替换,则在类外赋初始值,若想不可被替换,则在类内赋初始值;
特殊应用场景:
静态成员可以是不完全类型,即为所属类类型,而非静态成员只可声明为类的指针或引用;
静态成员可以是函数的实参,而非静态成员不可,因其值本身就属于类的一部分。
clss Bar
{
public:
Screen& clear(char = mem4);
//mem4是类中稍后声明的静态成员
private:
static Bar mem1; //正确:静态成员可以是不完全类型
Bar *mem2; //正确:指针成员可以是不完全类型
Bar mem3; //错误:数据成员必须是完全类型
static const char mem4;
}