代码改变世界

将类成员函数作为线程入口函数——关于C++ 类静态成员的学习

2012-06-25 22:29  上帝之骰  阅读(1432)  评论(0编辑  收藏  举报

在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

{

privateconst staic int r=20;

}