打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
请问:静态成员函数为什么只能访问静态成员?
态成员函数调用非静态成员变量

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自变量这一行为。
了类,就定义了静成员数据)所以,可以向上楼写的那样,定义形参为一个此类的对象,这样就可以访问此对象的非静态成员数据了!
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++中静态成员函数访问非静态成员变量
第四十五集 C语言的静态(static)函数
C#静态方法和非静态方法
关于String.valueOf()和.toString的问题
如何让后面的activity给前面的activity传数据?
关于类的静态与非静态成员变量及方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服