用静态成员函数调用非静态成员变量

本文探讨了C++中静态成员函数与非静态成员函数的区别,并介绍了如何通过静态成员函数访问非静态数据成员的方法。此外,还提供了一个在多线程环境下使用静态成员函数的示例。

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间接使用成员变量。 

   }

线程函数是回调函数,因此它必须是静态成员函数或者是类外部声明的全局函数。

在面向对象编程中,静态成员变量静态成员函数是与类的实例相关联的,因此必须通过类的对象来调用。具体来说,静态成员函数可以访问类的静态成员变量和调用其他静态成员函数[^1]。以下是对如何调用静态成员变量静态成员函数的详细说明: ### 调用静态成员变量 静态成员变量是类的实例变量,每个对象都有其自己的副本。要访问这些变量,必须首先创建类的对象,然后通过该对象来访问成员变量。例如,在C++中,可以通过以下方式访问静态成员变量: ```cpp class MyClass { public: int myVar; // 静态成员变量 }; int main() { MyClass obj; // 创建类的对象 obj.myVar = 10; // 通过对象访问静态成员变量 return 0; } ``` ### 调用静态成员函数 静态成员函数也是与类的实例相关联的,因此必须通过类的对象来调用。静态成员函数可以访问类的静态成员变量和其他静态成员函数。例如,在C++中,可以通过以下方式调用静态成员函数: ```cpp class MyClass { public: int myVar; // 静态成员变量 void setVar(int value) { // 静态成员函数 myVar = value; } int getVar() { return myVar; } }; int main() { MyClass obj; // 创建类的对象 obj.setVar(20); // 通过对象调用静态成员函数 int value = obj.getVar(); // 获取静态成员变量的值 return 0; } ``` ### 静态成员函数与静态成员的关系 需要注意的是,静态成员函数不能直接访问静态成员变量或调用静态成员函数,因为它们没有与任何对象关联,也没有`this`指针[^2]。如果需要在静态成员函数中访问静态成员,可以通过传递类的对象作为参数来实现。例如: ```cpp class MyClass { public: int myVar; static void accessNonStatic(MyClass obj) { // 静态成员函数 obj.myVar = 30; // 通过传递的对象访问静态成员变量 } }; int main() { MyClass obj; MyClass::accessNonStatic(obj); // 通过类名调用静态成员函数,并传递对象作为参数 return 0; } ``` ### 总结 在面向对象编程中,静态成员变量静态成员函数必须通过类的对象来调用。静态成员函数不能直接访问静态成员,但可以通过传递类的对象作为参数来间接访问[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值