1.static成员
static数据成员:非static数据成员存在于类类型的每一个对象中,而类static数据成员独立于该类的任意对象而存在;每个static数据成员是与类相关联的对象,并不与该类的对象相关联。
static成员函数:static成员函数没有this形参,这就意味着它是不能访问类中的非static数据成员的,而只能访问static数据成员。
使用类的static成员的优点:使用static成员而不是全局对象有三个优点:
(1)static成员的名字是在类的作用域中,因此可以避免与其他类的成员或者全局对象的名字冲突.
(2)可以实施封装。
(3)通过阅读程序可以更容易地看出程序员的意图,static成员是与特定的类相关联的。、
2.定义static成员
class Account
{
public:
static double rate() { return interestRate ; }
static void rate(double) ;
private:
std::string amount ;
double amount ;
static double interestRate ;
static double iniRate() ;
};
这个类的每个对象具有两个数据成员:owner和amount,对象没有雨static数据成员对应的数据成员,但是存在一个单独的static成员由全体的对象所共享。
3.使用类的static成员
可以通过作用域操作符从类直接调用static成员,或者通过对象,引用或指向该类类型对象的指针间接调用。
像其他成员一样,类成员函数可以不用作用域操作符来引用类中的static成员。
4.类的static成员函数
当我们在定义static成员函数时,如果是在类的外部定义函数时,不需要加上static关键字,只需要在类中static函数的声明处加上static关键字即可。
static成员是类的组成部分,但是不是任何类的对象的组成部分,因此static成员函数是没有this指针的。通过使用非static成员显式或隐式引用this是一个编译错误。
因为static函数不是任何对象的组成部分,所以static成员函数不能被声明为const,毕竟将成员函数声明为const就承诺不改变类中的数据成员。最后static函数也不能被声明为虚函数。
5.类的static数据成员
static数据成员必须在类定义体外部定义(正好一次)。不像普通的数据成员,static成员不能通过在类的构造函数中进行初始化,必须在定义时进行初始化。
例如: double Account::interestRate = initRate() ;
6.特殊的整形const static 成员
一般而言,类的static成员,像普通数据成员一样,不能在类的定义体中初始化。相反static数据成员通常在定义的时候才初始化。
这个规则的例外就是,只要初始化式是一个常量表达式,整形cosnt static数据成员就可以在累的定义体中进行初始化:
static const int period = 30 ;
用常量初始化的整形const static 数据成员是一个常量表达式。同样地,它可以用在任何需要常量表达式的地方。