在vc中使用多线程时,一般使用全局函数作为线程入口,这样创建线程时必须传入对象指针才能实现对类成员变量的访问。某日突发奇想:能不能使用类成员函数作为线程入口呢?
在线程外,入口函数可能是这么写: void ThreadFunc(LPVOID pParam)
如果直接移到类内部,visual C++ 编译器就会报错,因为CreateThread函数要求的入口函数必须为全局函数或者类静态成员函数。因此需要加上static前缀:
static void ThreadFunc(LPVOID pParam);
这样就可以成功访问类成员变量了吗?答案依然是否定的。
C++标准规定,静态成员函数只能访问静态成员变量,而不能访问类的非静态成员变量,这是因为静态成员函数的static 声明表明该函数是属于类而不是类的某一对象,而非静态成员函数则是属于类的某一特定对象的。在静态成员函数中对非静态成员函数进行访问,将无法定位到特定的对象,因此访问是无效的。同样的原因,静态成员函数中无法使用this指针。
静态成员变量同样属于类而非类对象,无论创建多少类对象,静态成员变量的存储空间都是唯一的,所有的类对象共享同一个静态变量。
静态成员变量一般这样在类定义中声明:
class circuit { private: staic int r; }
需要注意的是,这只是对静态成员的声明,变量的初始化不能在声明时进行,因为声明并未分配内存。
需要在cpp文件中对静态变量进行定义和初始化:
int circuit::r = 20;
初始化指定了操作类型,并用作用域操作符指定变量所属类。初始化只能进行一次,因此需要写在源文件中。
一种特例是由const限定的整形或者枚举类型,可以在类声明中初始化:
class circuit { private: const staic int r=20; }