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



◆函数加参数解决方法

1)、编译时候静态数据和成员函数就有了它的内存区,它不属于类的任何一个具体对象。所以,静态成员函数在编译时候就需要确定x及y的值,而那个时侯变量x,和y还没有创建,所以不可以访问非静态的数据成员。



2)、一般情况下静态成员函数用于访问同一类中的静态数据成员或全局变量,而不访问非静态成员,如需访问非静态成员,需要将对象作为参数,通过对象名访问该对象的非静态成员。

#include <iostream>
using namespace std;
class test
{
public:
      int x,y;
      test(int a=1 , int b=1) { x=a; y=b;}
      static void a(test t) { t.x=t.x+t.y; }
      void print() {cout<<"x="<<x<<endl; cout<<"y="<<y<<endl;}
};
void main()
{
  test t;
  t.print();
  t.a(t);
  t.print();

}


◆函数固定不能加参数解决方法

两种方法解决:
想办法传一个this指针进去或使用全局变量。
1)用全局变量
2)this指针
class CChangeUPSTime
{
public:
       static pascal OSStatus MainWindowEventHandler();
private:
     static CChangeUPSTime *m_pThis;
     WindowRef m_WindowRef;
};
CChangeUPSTime *CChangeUPSTime::m_pThis = NULL;
CChangeUPSTime::CChangeUPSTime()
{
     m_pThis = this;
}
OSStatus CChangeUPSTime::MainWindowEventHandler(){
    m_pThis->m_WindowRef = NULL;


原文地址:http://yaycici.blog.163.com/blog/static/173759063201291741815353/

在面向对象编程中,静态成员变量静态成员函数是与类的实例相关联的,因此必须通过类的对象来调用。具体来说,静态成员函数可以访问类的静态成员变量调用其他静态成员函数[^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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值