1. 通常,非static数据成员存在于类类型的每个对象中。而static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,而不是与该类的对象相关联。
2. 类可以定义共享的static数据成员,类也可以定义static成员函数。static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接访问使用非static成员。
3. 定义static成员:加上关键字static将成员设为static。static成员遵循正常的公有/私有访问规则。
4. 使用类的static成员:
通过作用域操作符从类直接调用static成员,或者通过对象、引用或指向该类类型对象的指针间接调用。
类成员函数可以不用作用域操作符来引用类的static成员。
5. static成员函数:
当我们在类的外部定义(定义,而不是声明)static成员时,无须重复指定static保留字,该保留字只出现在类定义体内部的声明处。
static成员函数不能被声明为const。毕竟,将成员函数声明为const就是承诺不会修改该函数所属的对象。
static成员函数不能被声明为虚函数。
6. static数据成员:
static数据成员必须在类定义体的外部定义(正好一次),不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化(通常将static数据成员的定义放在包含类的非内联成员函数定义的文件中)。
一般而言,类的static成员不能在类的定义体初始化,而是在定义时才初始化。但只要初始化式是一个常量表达式,整型const static数据成员就可以在类的定义体中进行初始化(但是,该数据成员仍必须在类的定义体之外进行定义,(**实际测试表明,不需要在定义体之外再次定义**))。
staticTest.h
#ifndef STATIC_TEST_H
#define STATIC_TEST_H
class StaticTest
{
public:
private:
static void AddCount(void);
static StaticTest stest; // ok
StaticTest *mem2;
// SatatcTest mem3; // error: 不能是类类型,只能是自身类型的对象或引用
static const int m_IntConst = 10;
static int s_Count;
// static const double m_DoubleConst = 1.0; // error: 不是整型
static double m_DoubleConst2;
};
#endif
staticTest.cpp:
#include "staticTest.h"
const int StaticTest::m_IntConst;
int StaticTest::s_Count = 0;
double StaticTest::m_DoubleConst2 = 1.0;
void StaticTest::AddCount(void)
{
s_Count++;
}