静态成员独立于任何对象。因此,在某些非静态数据成员可能非法的场合,静态成员却可以正常地使用。举个例子,静态数据成员可以是不完全类型。特别的,静态数据成员的类型可以就是它所属的类类型。而非静态数据成员则受到限制,只能声明它所属的指针或引用:
class Bar{
public:
//....
private:
static Bar mem1;//正确:静态成员可以是不完全类型
Bar *mem2;//正确
Bar mem3;//错误
};
另一个区别是,我们可以使用静态成员作为默认实参:
class Screen {
public:
Screen& clear(char = bkground);
private:
static const char bkground;
};
非静态数据成员不能作为默认实参,因为它的值本身属于对象的一部分,这么做的结果是无法真正提供一个对象以便从中获取成员的值,最终将引发错误。