一,static类成员
对于特定类类型的全体对象而言,访问一个全局对象有时是必要的。例如,在程序中需要统计已创建的特定类类型对象的数量。但是,定义一个全局对象会破坏封装性,一般的用户代码就可以修改这个值。类可以定义静态成员,而不是定义一个可普遍访问的全局对象。通常,非static数据成员存在于类类型的每个对象中。不像普通的数据成员,static数据成员独立于该类的任意对象而存在。每个static数据成员是与类相关联的,而不是与该类的对象相关联的。类也可以定义static成员函数,static成员函数没有this指针,它可以直接访问所属类的static成员,但是不能直接访问非static成员。
二,static成员
1,定义static成员:
在成员声明前加上关键字static,将成员声明为static。static成员遵循正常的公有/私有访问规则。例如:
class Account{
private:
static double interestRate;
double amount;
public:
static double rate(){
return interestRate;
}
static void setRate(double newRate){
interestRate = newRate;
}
};
2,使用类的static成员:
可以通过作用域操作符从类直接调用static成员,或者对象、引用、指向该类型对象的指针间接引用。例如:
int main(){
Account ac;
Account *pac = ∾
//对象间接引用
ac.rate();
//指针间接引用
pac->rate();
//使用类类直接调用
Account::rate();
return 0;
}
三,static成员函数
1,在类中声明static成员函数时要使用static关键字,在类外定义static成员函数,不用重复使用static关键字。
2,static成员函数没有this指针,因为static成员是类的组成部分,但不是任何对象的组成部分,因此,static成员函数没有this指针。因为static成员函数不是任何对象的组成部分,所以static成员函数不能声明为const。毕竟,将函数声明为const就是承诺该函数不会修改所属的对象。最后,static成员函数也不能声明为虚函数。
四,static数据成员
1,static数据成员必须在类类定义体的外部进行定义。不像普通的数据成员。static成员不是通过类构造函数进行初始化,而是在定义时进行初始化。例如:
class Account{
private:
static double interestRate;
double amount;
public:
static double rate(){
return interestRate;
}
static void setRate(double newRate){
interestRate = newRate;
}
};
//在类体外面定义并初始化static数据成员
double Account::interestRate = 20.0;
2,特殊的const static成员
类的static数据成员,像普通数据成员一样,不能在类的定义体中初始化。相反,static数据成员通常在定义时才初始化。这个规则的一个例外是,只要初始化式是一个常量表达式,整型const static数据成员就可以在类的定义体中进行初始化。同样,它可以用在任何需要常量表达式的地方,例如指定数组成员daily_tbl的大小。
class Account{
private:
//const static常量在类体中进行初始化
const static period = 20;
double daily_tbl[period];
double amount;
public:
static double rate(){
return interestRate;
}
static void setRate(double newRate){
interestRate = newRate;
}
};
3,static成员不是类对象的组成部分
普通成员都是给定类的每个对象的组成部分,static成员独立于任何类对象存在,不是类对象的组成部分。所以,它们的使用方式对于非static数据成员而言是不合法的。例如,static数据成员的类型可以是该成员所属的类的类型。非static成员被限定声明为其自身对象的指针或引用。
class Account{
private:
static Account ac;
Account *pac;
public:
//
};