静态成员函数调用非静态成员变量-p…

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  

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自变量这一行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值