一、类的静态成员
有时候,类需要它的一些成员与类本身直接相关,而不是与类的对象没有关系。这个时候,我们就需要类的静态成员。例子如下,定义一个类,用它表示银行的账户记录。
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,而且也不能在static函数体内使用this指针。
定义静态成员:
(当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句)
因为静态数据成员不属于类的任何一个对象,所以他们并不是在创建类的对象时被定义的。这意味着他们不是由类的构造函数初始化的。而且一般来说,我们不能在类的内部初始化静态成员。相反的,必须在类的外部定义和初始化每个静态成员。
double Account::interestRate=0.03//定义并初始化
字面值常量类型的静态成员才能类内初始化
class Account {
public:
static double rate()
{
return interestRate;
}
static void rate(double);
private:
string owner;
double amount;
static double interestRate;
static constexpr int period = 30;//period是常量表达式
double daily_tbl[period];
};
但是,着并不意味着外部就不用定义period了,即使一个常量静态数据成员在类内部被初始化了,通常情况下,也应该在类的外部定义一下该成员。
二、析构函数
析构函数执行与构造函数相反的操作:构造函数初始化对象的非static数据成员,还可能做一些其它工作;析构函数释放对象使用的资源,并销毁对象的非static数据成员。析构函数是类的一个成员函数,名字由波浪号接类名构成,没有返回值,不接受参数。
在一个析构函数中,首先执行函数体,然后销毁成员,成员按初始化顺序的逆序销毁。在对象的最后一次使用之后,析构函数的函数体会先被执行,这个函数体一般是写了类的设计者希望执行的任何收尾工作。