一直在用static,现总结一下,注意事项
在一个类中定义静态成员变量 和 静态成员函数
<pre name="code" class="cpp">class example{
privat:
INT a;
static WORD b;
public:
static void func(WORD x){b = x;}
void func1(INT y){a = y;}
};
static成员变量不属于对象的一部分,而是属于类,所以程序在还没有诞生该类对象时就开始处理static成员变量,因此,在定义该类对象前,必须先初始化该static成员变量。
如上例, 在应用程序cpp文件中必须先初始化 b,(一般不会在类、头文件中初始化,原因是初始化仅需一次就行,你在类中或头文件中初始化,可能被初始多次)。
初始化:
WORD exmple::b = 0; //初始化静态成员变量b
void main(){........}
严格意义上讲,上面对b的操作是初始值设定操作,并不是赋值操作,所以尽管b是私有变量(私有变量赋值一般要用公共函数操作,如func1函数,当然,如果定义成公有变量就没必要用func1这样的函数了),也是可以这么做,
事实上,static实在设定初始值时才被真正意义上的定义出来的(不是在类中声明)。如果没有初始化静态成员变量,就会报链接错误的,错误大致是:
error LINK2001: unresolved external symbol ...................................................
虽然static不依赖于对象才得以实现,但它可以通过对象来调用如:
example Ex1;
example::func(10);
Ex1.func(10);
上面的两种赋值都是可以的。其中func(),就是静态成员函数,所以它是可以不用借助任何对象就可以实现,由于编译器不会暗自添加一个this指针给静态成员函数,所以,静态成员函数只能处理类中的static成员,对与非static成员无法调用。但非静态成员函数可以调用静态成员变量。
注:类中的非静态成员函数,编译器在执行时,会暗自分配一个this指针,指向该对象。
如:
example Ex2;
Ex2.func1(10);
其实编译器所认为的是这样的:
example::func1(10,(example*)&Ex2);