1、使用static类的优点:
(1)避免与其他类的成员或者全局变量冲突
(2)可以封装
(3)阅读性好
2.static 数据成员独立于该类的任意对象而存在
static数据成员的类型可以是该成员所属的类类型。非static成员被限定声明为其自身类对象的指针或引用。
class Bar{
public:
//
private:
static Bar mem1; //ok
Bar *mem2;//ok
Bar &mem3;//ok
Bar mem4;//error 不能脱离类的对象而存在,不像static与对象无关
}
注意事项:
(1)用static可以为类类型的所有对象所共有,像是全局对象,但又被约束在类类型的名字空间中。
(2)可以实施封装,将其放在private或protected区域中。
(3)static成员没有this指针,它不是任何一个对象的组成部分,推荐用“类名::static成员名调用”。
(4)static数据成员声明时,写明static关键字,定义时不能加static关键字。而且,static数据成员必须要在类声明之外作定义。
(5)需要指出的是,尽管它不是任何一个对象的组成部分,但是类的成员函数可以直接访问static数据成员,可以通过类对象、类对象的引用、或者指向该类型的指针调用static类成员变量。例如:
class A
{
public:
static int m;
static void display(); // 声明
};
int A::m=0; // 定义
void A::display()
{
cout<<"m ="<<m<<endl;
}
void main()
{
A temp;
temp.display();
cout<<++temp.m<<endl;
}
但是当类中声明的static变量为private时,则只能通过类的作用域作用符调用,例如
class A{
private:
static int m;
static void display(); // 声明
};
int A::m=0; // 定义
void A::display(){
cout<<"m ="<<m<<endl;
}
int main(){
A::display(); // 通过作用域操作符::调用
}
3. static成员变量的初始化
static数据成员必须在类定义题的外部定义(正好一次)。不像普通数据成员,static成员不是通过类的构造函数初始化的,而是应该在定义时初始化(没有任何例外!!!)。在类定义体外部引用类的static成员时,必须指定成员是在哪个类中定义的。static关键字只能用于类定义体内部的声明中,定义时不能标示为static。
class A{
private:
static int m;
static void display(); // 声明
};
int A::m=0; // 定义
void A::display(){
cout<<"m ="<<m<<endl;
}
int main(){
A::display(); // 通过作用域操作符::调用
}
4. const static数据成员
1)static const 与const static是一样的,没有区别。
2)static const存储在静态存储区域,不可修改其值的常量,可用来替代define或enum
3)所有类型的变量都可以声明为static const,必须要在类定义体之外进行定义并初始化,只能在类定义体中进行声明。唯一的一个例外:对于整形类型(见《C++ Premier》P30页定义,包括int,bool,char,long等类型),则可以在类定义体中进行定义并初始化,但必须仍旧在类的定义体外进行声明。
[注解:上述这条针对const static 整形成员变量的规则,在VC6.0下编译会有问题,但这是编译器本身的缘故,在其他高版本的VS环境下编译没有问题。]
4)将变量声明为static const,是为了实际需要,为了设定一个在整个class范围内都不变的常量。
只要初始化式是一个常量表达式,整形const static数据成员就可以再类的定义体中进行初始化。
class Count{
public:
static double rate(){return interest_rate;}
static void rate(double);
private:
static const int period=30;
double daily_tbl[period];
};
const static 整形数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行声明:
const int Count::period;