关键字总结-static
文章目录
概念
在一个类中,有时候并不希望所有的成员都能与类的对象相关联,而只希望有些成员能够被类的所有对象共享,此时就需要用到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 initRate();
}
因为静态成员直接与类绑定,所以类的对象中不包括任何与静态成员(数据+函数),因此,每个Account
对象只包含成员函数calculate()
以及数据成员owner
、amount
static使用场景
只能出现在类内部的声明语句中
静态成员的使用
使用静态成员:(1)域作用符(2)使用类的对象、引用、指针
double r = Account::rate();
Account ac1;
Account *ac2;
//虽然静态成员不属于某个对象,但仍旧可以用某个对象来访问
r = ac1.rate();
r = ac2->rate();
使用静态数据成员:
注意定义Account::calculate()
函数时,即在静态成员函数内部,不需要使用域作用符也能访问静态数据成员。
类外初始化静态成员
可以在类外定义静态成员函数,要注意表明返回值类型与作用域
void Account::rate(double newRate)
{
interestRate = newRate;
}
一般,不能在类内直接初始化静态成员,必须在类的外部定义和初始化每个静态成员,在类的内部只是声明。这是因为静态成员属于整个类,如果在类内初始化,会导致每个对象都包含该静态成员。但也是可以以一种特殊方式(静态常量成员)在类内初始化静态成员的。
//类外初始化一个静态数据成员
double Account::interestRate = initRate();
//注意initRate()是私有方法,但是从域名开始,这条语句的剩余部分就在类的作用域中了