手里拿着c++primer 3,突然翻到静态类成员那节,就仔细看了下,有种想记下来的冲动
class ClassName {
public:
// method
private:
static valueType value;
// ......
};
上面定义了类的静态成员value,类的静态成员有一下特性:
1. 对于所有的类对象要用到的数据,为了提高效率和节省存储空间,可以把这个变量定义为static型的,因为static型变量在所有的类对象种只有一个拷贝
2. static的定义放在类体的外面(跟类的成员函数有点相似),一般不放在.h 文件种,因为只能对static型变量只能进行一次定义,如果放在.h文件种,当程序种引用该.h文件时,将出现重复定义的编译错误。 有一个特殊情况,当static 限制的是const int型变量时,可以在类体种定义,这时候该变量相当于常量表达式,若果想要用这个变量,还要在类外对变量进行声明;eg:
class A {
public:
// ....
private:
static const int a = 100;
static const char b[ a] ;
};
const int A::a ; // it is necessary
const char A::b[a] = "yes";
3. static变量可以被类成员函数直接访问
4. static 数据成员的类型可以是其所属的类类型,非static类型只能被声明为该类对象的指针和引用eg:
class A {
public : // ...
private:
static A mem1;
A * mem2;
A & mem3;
};
4. static 数据成员可以被声明为任意类型。
5。static 数据成员可以类成员函数的缺省实体,但是非static不行;
eg :
extern int var ;
class Foo {
private:
int var ;
static int stcvar;
public:
int mem1 ( int = var) ; // 错误,被解析为非static 的Foo::var,没有相关的类对象
int mem2 (int = stcvar); // ok,被解析为static的 Foo::stcvar,无需相关的类对象
int mem3 (int = ::var); // ok, int var的 全局实例
}