用静态成员函数调用非静态成员变量
2013-05-09 11:52
330 查看
C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数不接受隐含的this自变量。所以,它就无法访问自己类的非静态成员。
在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利用各种解决办法才能够从静态成员函数访问到非静态数据成员。
第一个解决办法是声明类的所有数据成员都是静态的。运用这种方式的话,静态的成员函数就能够直接地访问它们,例如:
class Singleton
{
public:
static Singleton * instance();
private:
Singleton * p;
static Lock lock;
};
Singleton * Singleton::instance()
{
lock.getlock(); // fine, lock is static
if (!p)
p=new Singleton;
lock.unlock();
return p;
}
这种解决方法不适用于需要使用非静态数据成员的类。
访问非静态数据成员
将参照传递给需要考量的对象能够让静态的成员函数访问到对象的非静态数据:
class A
{
public:
static void func(A & obj);
intgetval() const; //non-static member function
private:
intval;
};
静态成员函数func()会使用参照obj来访问非静态成员val。
voidA::func(A & obj)
{
int n = obj.getval();
}
将一个参照或者指针作为静态成员函数的自变量传递,就是在模仿自动传递非静态成员函数里this自变量这一行为。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
创建线程时,线程函数如果要设置成类的成员函数,则必须是静态成员函数,在此函数种不能使用非静态成员变量,如果要使用非静态成员变量,则一种比较适合线程的方法是:建立线程的时候把this作为CreateThread的一个参数(即第4个参数,就是那个LPVOID型的),然后线程里就对应pParam,例如:
static UINT ThreadProc(LPVOID pParam)
{
Your_Class *p=(Your_Class *)pParam;
//然后用p间接使用成员变量。
}
线程函数是回调函数,因此它必须是静态成员函数或者是类外部声明的全局函数。
在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利用各种解决办法才能够从静态成员函数访问到非静态数据成员。
第一个解决办法是声明类的所有数据成员都是静态的。运用这种方式的话,静态的成员函数就能够直接地访问它们,例如:
class Singleton
{
public:
static Singleton * instance();
private:
Singleton * p;
static Lock lock;
};
Singleton * Singleton::instance()
{
lock.getlock(); // fine, lock is static
if (!p)
p=new Singleton;
lock.unlock();
return p;
}
这种解决方法不适用于需要使用非静态数据成员的类。
访问非静态数据成员
将参照传递给需要考量的对象能够让静态的成员函数访问到对象的非静态数据:
class A
{
public:
static void func(A & obj);
intgetval() const; //non-static member function
private:
intval;
};
静态成员函数func()会使用参照obj来访问非静态成员val。
voidA::func(A & obj)
{
int n = obj.getval();
}
将一个参照或者指针作为静态成员函数的自变量传递,就是在模仿自动传递非静态成员函数里this自变量这一行为。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
创建线程时,线程函数如果要设置成类的成员函数,则必须是静态成员函数,在此函数种不能使用非静态成员变量,如果要使用非静态成员变量,则一种比较适合线程的方法是:建立线程的时候把this作为CreateThread的一个参数(即第4个参数,就是那个LPVOID型的),然后线程里就对应pParam,例如:
static UINT ThreadProc(LPVOID pParam)
{
Your_Class *p=(Your_Class *)pParam;
//然后用p间接使用成员变量。
}
线程函数是回调函数,因此它必须是静态成员函数或者是类外部声明的全局函数。
相关文章推荐
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 静态成员函数如何调用非静态成员变量(函数参数不能任意扩展的情况)
- C++静态成员函数不能调用非静态成员变量
- 静态成员函数调用非静态成员变量
- C++静态成员函数不能调用非静态成员变量(详解)
- 用静态成员函数调用非静态成员变量
- C++静态成员函数不能调用非静态成员变量
- C++静态成员(静态成员变量、静态成员函数)与正常成员互相调用的权限问题
- 静态成员函数调用非静态成员变量
- 结合上面的五个例子,对类的静态成员变量和成员函数作个总结: 一。静态成员函数中不能调用非静态成员。 二。非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所
- 为什么C++静态成员函数不能访问非静态成员变量、不能调用非静态成员函数?(面试常考)
- 静态成员函数如何调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量(转)
- 静态成员函数调用非静态成员变量-p…
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量-p…