C++友元H5斗地主棋牌源码全套法详解

在C++中,H5斗地主棋牌源码全套( h5.super-mans.com Q:2012035031)H5斗地主棋牌源码全套,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

友元函数 : 
       友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
       friend 类型 函数名(形式参数);
       友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
       一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
       友元函数的调用与一般函数的调用方式和原理一致。
友元类 : 
       友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。       
       当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
       friend class 类名;
       其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。

例如,以下语句说明类B是类A的友元类:
       class A
       {
              …
       public:
              friend class B;
              …
       };
       经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

使用友元类时注意:
             (1) 友元关系不能被继承。 
             (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
             (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
《windows环境多线程编程原理与应用》中解释:
  如果将类的封装比喻成一堵墙的话,那么友元机制就像墙上了开了一个门,那些得
  到允许的类或函数允许通过这个门访问一般的类或者函数无法访问的私有属性和方   
  法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。

友元类:

将外界的某个类在本类别的定义中说明为友元,那么外界的类就成为本类的“朋  
   友”,那个类就可以访问本类的私有数据了。
   class Merchant
      {
          private :
             int m_MyMoney;
             int m_MyRoom;
             … …
          Public:
             Friend class Lawyer;
             Int getmoney();
             … …
      };
      Class Lawyer
     {
        Private:
          … …
        Public:
         … …
     };
     只有你赋予某个类为你的友元时,那个类才有访问你的私有数据的权利。说明一个函数为一个类的友元函数则该函数可以访问此类的私有数据和方法。定义方法是在类的定义中,在函数名前加上关键字friend.

需要友元与友元的优缺点:

通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。

友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但所矛盾的是,即使是最大限度大保护,同样也破坏了类的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它,但它作为c++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。 在类里声明一个普通数学,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。

下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的:

[cpp] view plain copy

print?

  1. #include <iostream>
  2. using namespace std;
  3. class Internet
  4. {
  5. public:
  6. Internet(char *name,char *address) // 改为:internet(const char *name , const char *address)
  7. {
  8. strcpy(Internet::name,name);
  9. strcpy(Internet::address,address);
  10. }
  11. friend void ShowN(Internet &obj);   //友元函数的声明
  12. public:              // 改为:private
  13. char name[20];
  14. char address[20];
  15. };
  16. void ShowN(Internet &obj)        //类外普通函数定义,访问<span style="color: rgb(85, 85, 85); font-family: "microsoft yahei"; font-size: 15px;">a对象的保护成员name</span>,不能写成,void Internet::ShowN(Internet &obj)
  17. {
  18. cout<<obj.name<<endl;          //可访问internet类中的成员
  19. }
  20. void main()
  21. {
  22. Internet a("谷歌","http://www.google.cn/";);
  23. ShowN(a);
  24. cin.get();
  25. }

示例2:

分别定义一个类A和类B ,各有一个私有整数成员变量通过构造函数初始化;类A有一个成员函数Show(B &b)用来打印A和B的私有成员变量,请分别通过友元函数和友元类来实现此功能。使用友元类 和 友元函数实现:

[cpp] view plain copy

print?

    1. #include <iostream>
    2. using namespace std;
    3. class B;
    4. class A;
    5. void Show( A& , B& );
    6. class B
    7. {
    8. private:
    9. int tt;
    10. friend class A;
    11. friend void Show( A& , B& );
    12. public:
    13. B( int temp = 100):tt ( temp ){}
    14. };
    15. class A
    16. {
    17. private:
    18. int value;
    19. friend void Show( A& , B& );
    20. public:
    21. A(int temp = 200 ):value ( temp ){}
    22. void Show( B &b )
    23. {
    24. cout << value << endl;
    25. cout << b.tt << endl;
    26. }
    27. };
    28. void Show( A& a, B& b )
    29. {
    30. cout << a.value << endl;
    31. cout << b .tt << endl;
    32. }
    33. int main()
    34. {
    35. A a;
    36. B b;
    37. a.Show( b );
    38. Show( a, b );
    39. return 0;
    40. }

原文地址:https://www.cnblogs.com/yishiernian/p/8350768.html

时间: 2024-10-11 07:15:07

C++友元H5斗地主棋牌源码全套法详解的相关文章

MySQL微信房卡麻将棋牌源码全套实现原理

在MyS微信房卡麻将棋牌源码全套( h5.super-mans.com Q:2012035031)微信房卡麻将棋牌源码全套的事务隔离级别. 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏读.幻读.不可重复读问题.(基本没用) 读已提交:一个事务只能读取另一个事务已经提交的修改.其避免了脏读,但仍然存在不可重复读和幻读问题. 可重复读:同一个事务中多次读取相同的数据返回的结果是一样的.其避免了脏读和不可重复读问题,但幻读依然存在. 串行化:事务串行执行.避免了以上所有问题. 以上是

h5牛牛棋牌源码安装服务器教程

h5牛牛棋牌源码安装服务器 材料下载:h5.hubawl.com 1.系统:windows2008独立服务器,8核处理器,内存8G,带宽10M以上,php5.6以上版本+MYSQL 5.5的运行环境/或者Linux均可 2.备案域名+微信公众号+认证服务号 3.特别说明:Php环境要求ssl,需要一个cacert.pem证书文件 架设步骤: 1,导入程序根目录下的db.sql,到你的数据库 2,修改数据库配置文件/application/database.php里的数据库连接信息(请勿使用记事本

微信h5牛牛棋牌源码搭建架设详细教程

HTML的文件结构:html head网页头部信息(微信h5牛牛棋牌源码搭建架设Q_2189563389)/head body网页主体正文部分/body /html HTML的基本标记:定义网页背景色--bgcolor body bgcolor="背景颜色 " 设置背景图片--backgroung body background="图片的地址 " 设置文字颜色--text body text="文HTML的文件结构:<(h5牛牛棋牌平台开发www.y

机器学习Spark Mllib算法源码及实战详解进阶与提高视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

onLayout源码 流程 思路详解(ANDROID自定义视图)

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 第一步的测量,可以参考我之前的文章:(ANDROID自定义视图--onMeasure流程,MeasureSpec详解) 而这篇文章就来谈谈第二步:"

linux上源码安装MySQL详解

最近需要使用MySQL Fabric,这货是MySQL5.6.10之后才出现的utility.手头机器装的是MySQL5.1,所以需要先把旧版MySQL升级成5.6版本.之前没有玩过MySQL,所以这次稍微费了点事.在此,把过程记录下来,希望能给有需求的人提供一点帮助.下面我们就正式开始. 1. 删除老版本MySQL 其实删除老版MySQL是一件很简单的事,但是开始时候由于担心各个包的依赖会导致各种问题,亦步亦趋来得很慢.其实只需要做到这么几步就可以了: 1.1 查看已安装的mysql版本并删除

【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3.绘制——onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 而这篇文章就来谈谈第一步

Spring Boot源码中模块详解

Spring Boot源码中模块详解 一.源码 spring boot2.1版本源码地址:https://github.com/spring-projects/spring-boot/tree/2.1.x 二.模块 Spring Boot 包含许多模块,以下是一些简单的概述: 1,spring-boot 为Spring Boot其他部分功能提供主要的lib包,其中包含:(1)SpringApplication类提供了静态便利的方法使编写独立的SpringApplication更加容易.它唯一的任

为什么我怎么也理解不了H5微信棋牌源码,是因为智商不够吗?

大家不知道,著名的薛定谔的猫H5微信道游棋牌平台源码架设出售( h5.super-mans.com Q2012035031 ?17061863513 vx同)并不是帮助大家理解量子力学,而恰恰是由于他无法接受量子理论里面诡异的"世界观",提出这个思想实验的目的是告诉大家量子力学有多荒谬,所以他决定放弃.Well,从薛定谔到现在,发生了很多事.一些实验和理论的完善,让量子理论的说服力越来越强.这个回答中会讨论一些.能不能够说服你,就看你啦!有的时候你觉得你没理解,其实仅仅是你没被量子理论