博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态成员函数调用非静态成员变量-p…
阅读量:4051 次
发布时间:2019-05-25

本文共 797 字,大约阅读时间需要 2 分钟。

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自变量这一行为。

转载地址:http://xvpci.baihongyu.com/

你可能感兴趣的文章
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
uboot.lds文件分析
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
01Java基础语法-16. while循环结构
查看>>
01Java基础语法-18. 各种循环语句的区别和应用场景
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>
socket,accept函数解析
查看>>