**
类的静态成员
**
类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。
静态成员的声明
在成员声明之前加上Static使得其与函数关联。
举个例子:
Class Account
{
private:
std::string owner;
double amount;
static double interestRate;
static double initRate();
public:
static double Rate()
{
return interestRate;
}
};
对于Account的每一个对象豆浆包含owner和amount两个数据成员,而对于静态成员interestRate只有一个,且被所有的对象共享。
- 静态成员的使用
1.使用作用域运算符直接访问
double r;
r=Account::Rate();
2.使用类的对象、引用、指针来访问
Account ac1;
Account *ac2=&ac1;
r=ca1.Rate()//通过对象或引用
r=ca2.Rate()//通过指向对象的指针
3.成员函数可以直接使用静态成员
class Account
{
private:
static double interestRate;
public:
void calculate()
{
amount+=amount* interestRate;
}
};
- 定义静态成员
1.静态成员的定义可以在类的内部或者外部。
2.如果在类的外部定义静态成员,则无需加Static关键字,关键字只在类内声明时出现。
3.由于静态成员不属于类的任何一个对象,所以它不会被类的构造函数初始化。必须在类的外部定义和初始化静态成员。
定义时需要指定其类型名、类名、作用域运算符及成员自己的名字:
double Account::interestRate=initRate();//定义并初始化
- 静态成员的类内初始化
通常静态成员不可以在类内初始化,但是可以为静态成员提供const整数类型的类内初始值,但是要求成员必须是字面值常量类型的constexpr。
例如:用一个初始化了的静态成员表示数组的维度
class Account
{
private:
static constexpr int period=30;
double daily_tbl[period];
};
此时,period只用于定义daily_tbl的维度,则不需要在外面专门定义,但是要把Account::period传递给一个接受 const int&的函数时,必须定义。
constexpr int Account::period;//一个不带初始值的静态成员的定义
一个静态成员在类内被初始化了,在类的外部也应该定义一下该成员
- 静态成员可以应用的场景
1.静态成员可以是不完全类型
class Bar
{
private:
Static Bar mem1;//正确
Bart *men2;//正确,指针成员也可以是不完全类型。
Bar men3;//错误
};
2.静态成员可以作为默认参数
Class Screen
{
private:
Static const char bkground;
public:
Screen& clear (char=bkground);
};