分享

请问:静态成员函数为什么只能访问静态成员?

 XX_YY_ZZ 2015-11-07
态成员函数调用非静态成员变量

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自变量这一行为。
maxlcl
了类,就定义了静成员数据)所以,可以向上楼写的那样,定义形参为一个此类的对象,这样就可以访问此对象的非静态成员数据了!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多