友元是指:

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

友元分为友元函数和友元类,两种具有不同的调用形式:

[cpp] view plaincopy
  1. class  Data{
  2. public:
  3. ...
  4. friend  int set(int &m);//友元函数
  5. friend  class peop;     //友元类
  6. ...
  7. }

友元函数:

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:

friend  类型 函数名(形式参数);

1.友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。

2.一个函数可以是多个类的友元函数,只需要在各个类中分别声明。友元函数的调用与一般函数的调用方式和原理一致。

友元类

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。
      例如,以下语句说明类B是类A的友元类:

[cpp] view plaincopy
  1. class A{
  2. public:
  3. friend class B;
  4. };

经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

使用友元类时注意:

(1) 友元关系不能被继承。

(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。

(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

(4) 友元函数并不是类的成员函数,因此在类外定义的时候不能加上class::function name

下面我们完整的看一个友元的例子:

[cpp] view plaincopy
  1. //来自友元——互动百科
  2. #include
  3.   #include
  4. class Point//声明
  5.   {
  6.   public:
  7.     Point(double xx, double yy) { x=xx; y=yy; }//默认构造函数
  8.     void Getxy();//公有成员函数
  9.     friend double Distance(Point &a, Point &b);//友元函数
  10.   private:
  11.     double x, y;
  12.   };
  13.   void Point::Getxy()
  14.   {
  15.   cout<<"("<
  16.   }
  17.   double Distance(Point &a, Point &b)  //注意函数名前未加类声明符
  18.   {
  19.   double dx = a.x - b.x;
  20.   double dy = a.y - b.y;
  21.   return sqrt(dx*dx+dy*dy);
  22.   }
  23.   void main()
  24.   {
  25.   Point p1(3.0, 4.0), p2(6.0, 8.0);
  26.   p1.Getxy();
  27.   p2.Getxy();
  28.   double d = Distance(p1, p2);
  29.   cout<<"Distance is"<
  30.   }

C++关键字 friend相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  3. volatile关键字之全面深度剖析

    引言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...

  4. mysql屏蔽关键字实现方法_PHP屏蔽过滤指定关键字的方法

    本文实例讲述了PHP屏蔽过滤指定关键字的方法.分享给大家供大家参考.具体分析如下: 实现思路: 一.把关键字专门写在一个文本文件里,每行一个,数量不限,有多少写多少. 二.PHP读取关键字文本,存入一 ...

  5. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  6. Java this 关键字使用

    this 引用就是本类的一个对象 理解这句话看下面一段代码 package me; public class Me {String name; //成员变量int age;public Me(Stri ...

  7. java 关键字(面试题)

    学而时习之,温故而知新. 今天群里有人问java中true ,false 是关键字吗, 这里记录下,不是关键字,我还特意翻看之前的书看看 下面是 Java 语言保留使用的 50 个关键字: 关键字 g ...

  8. java中标识符,关键字,数据类型

    什么是标识符? 在java语言中用来给一个类,变量或方法命名的符号 标识符的命名规则 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包含 @.%.空格等其它特殊字符,不能以数字开头. ...

  9. iOS面试题整理---关键字!!!

    关键字整理 static 1.static全局变量与普通的全局变量有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当 ...

  10. private关键字和构造方法

    1.private: A: 是一个修饰符 B:可以 修饰成员变量,也可以修饰成员方法 C:被private修饰的成员只能在本类中访问 D:针对private修饰的成员变量,可以用getXxx()和se ...

最新文章

  1. 软件工程(2019)第三次个人作业
  2. 【PAT甲级 最长公共子串】1007 Maximum Subsequence Sum (25 分) C++ 全部AC
  3. 将Lucene搜索集成到应用程序中
  4. mysql不能存字母,使用不常見的字母/符號時,MySql數據庫不能正確存儲數據
  5. 第45届国际大学生程序设计竞赛(ICPC)沈阳站太原理工大学收获1枚铜牌
  6. 转 未能使用提供程序 RsaProtectedConfigurationProvider 进行解密 的解决办法
  7. 基于OpenGL的贪吃蛇游戏设计与实现
  8. 2021-05-20
  9. 【Python学习】pandas 删除重复行
  10. 大数据全样而非抽样原理_一文带你了解什么是大数据
  11. 22-09-20 西安 谷粒商城(04)Redisson做分布式锁、布隆过滤器、AOP赋能、自定义注解做缓存管理、秒杀测试
  12. java添加窗体中_java中利用JFrame创建窗体 【转】
  13. javaSE探赜索隐四<数组>
  14. Fritzing软件绘制Arduino面包板接线图传感器模块库文件300
  15. Android应用开发接入讯飞语音合成
  16. GBase8s数据库REFERENCES 子句
  17. 把时间当作朋友 读后感
  18. 修改element-ui中时间选择器的样式
  19. java/php/net/python高校大学生创新创业管理系统设计
  20. 简历应该怎么写,HR看一篇简历仅需要5秒吗,简历模板大全

热门文章

  1. 互联网+ 何人能挡?带着你的Code飞奔吧!
  2. filestream streamreader
  3. Java操作Mysql实例
  4. Sketch2Code 前端智能AI-识别草图生成代码
  5. 软件开发整理的一些工具
  6. NLP --- 隐马尔可夫HMM(概念详解、三个基本问题详解)
  7. 软件开发计划_软件开发的流程是怎么样的?福州IT告诉你:这五点是你需要掌握的...
  8. Bootstrap 提示工具(Tooltip)弹出框
  9. 平衡二叉树删除_自平衡二叉树实现及时间复杂度分析
  10. mobaxterm设置中文界面_如何使用MobaXterm打开WSL2的GUI程序