一,static类成员的优点(区别于全局对象)
①static在类的作用域中,可避免同名全局对象冲突.
②可实施封装,不容易被外部简单更改其值.
③通过引用方式(区域符::)可清晰表明是与特定类关联的.
二,定义static成员
①每个类对象都没有与static数据成员相对应,这个static成员是由整个类类型的全体对象共享,
同一个类的所有对象共用同一个static成员.
②遵循正常的公有/私有访问规则.
static 类型 name;
static 类型 name();
三,使用类的static成员
①通过 Classobj.member 使用(类对象.成员)
②通过 Classp->menber 使用(类指针->成员)
③通过 Class::member 使用(类::成员)
四,static成员函数
外部定义static成员函数时,无须重复指定static保留字,保留字只出现在类定义体内声明处:
class A{
public:
//public members
private:
static int fun();
//else private members
};
int A::fun() { .....; }
(因为 statci 成员是类的组成部分而不是任何对象的组成部分, 所以 static 函数木有 this 指针)
五,static数据成员
※在类的定义体外部进行定义.static数据成员不能通过构造函数进行初始化,应在定义变量时进行初始化.
先指定类型,后接成员的完全限定名.(随后可没有限定地直接使用类的数据成员或成员函数)
类型 类::static_mem = value;(value 可以为类的数据成员或成员函数)
六,特殊的整型 const static 成员
在类的定义体中进行初始化,在类的定义体外进行定义
(ps:类定义时内存并没有分配空间给static成员,需对static成员进行定义才能使用static成员)
类定义体中:
static const int p = 30;
类定义体外:
const int Class::p ; //不必再制定其初始值
七,static成员不是类对象的组成部分
①static数据成员可以是该成员所属的类类型.非static成员被限定为自身类型的指针或引用
②static数据成员可用作默认实参(static成员的值可独立于类对象使用):
class Bar{
public:
Bar& clear(char = bkground);//默认clear()函数的实参为char类型的bkground
private:
static const char bkground = '#';
static Bar mem1; //ok.
Bar *mem2; //ok
Bar mem3; //error,不能定义自身类型对象作为数据成员
};