1.为什么需要友元函数? 

  • 类具有封装和信息隐藏的特性:

    • 只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的 ;
    • 非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,又破坏了隐藏的特性 ;
  • 友元是一种定义在类外部的普通函数,但它需要在类体内进行声明.在说明时前面加以关键字 friend ;
  • 友元不是成员函数,但它可以访问类中的私有成员 ;
#include <iostream>
#include <math.h>
using namespace std;
class Point{
public:Point(double xx, double yy) { x=xx; y=yy; }//构造函数void Getxy();//声明一个普通成员函数friend double Distance(Point &a, Point &b);//将一个普通函数声明成友元
private:double x, y;
};void Point::Getxy(){cout<< "x:"<< this->x << " "<<"y:" <<this->y<<endl;
}
double Distance(Point &a, Point &b){double dx = a.x - b.x;double dy = a.y - b.y;return sqrt(dx*dx+dy*dy);
}
/*
说明:在该程序中的Point类中说明了一个友元函数Distance(),它在说明时前边加friend关键字,标识它不是成员函数,而是友元函数。
它的定义方法与普通函数定义一样,而不同于成员函数的定义,因为它不需要指出所属的类。
但是,它可以引用类中的私有成员,函数体中 a.x,b.x,a.y,b.y都是类的私有成员,它们是通过对象引用的。
在调用友元函数时,是同普通函数的调用一样,不要像成员函数那样调用.
*/
int main()
{Point p1(3.0, 4.0), p2(6.0, 8.0);p1.Getxy();p2.Getxy();double d = Distance(p1, p2);cout<<"Distance is "<< d <<endl;return 0;
}

:别的类的成员函数作友元,也就是2个类相互调用,无论谁定义在前在后,编译时都有冲突.

要解决这个问题:将类的声明、定义分开.

2.友元类

友元类:一个类A可以作另一个类B的友元.意味着这个类A的所有成员函数都是另一个类B的友元函数

class B{//...friend class A; //声明 A是B的友元类//...
};class A{//...};

使用友元类时注意:

  • 友元关系不能被继承;
  • 友元关系是单向的,不具有交换性:若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明;
  • 友元关系不具有传递性:若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明;
    #include <iostream>  using namespace std;  class CObj
    {
    public:  CObj() : mX(0), mY(0) {}  friend class CFriend;
    private:  void PrintData() const  {  cout << "mX = " << mX << endl  << "mY = " << mY << endl;  }  int mX;  int mY;
    };  class CFriend
    {
    public:  CFriend(int x, int y)  {  mObj.mX = x;    //直接调用类CObj的私有数据成员  mObj.mY = y;  }  void ShowData() const  {  mObj.PrintData();   //直接调用类CObj的私有成员函数  }
    private:  CObj mObj;
    };  int main()
    {  CFriend one(3, 4);  one.ShowData();  return 0;
    }
    

      

转载于:https://www.cnblogs.com/chenjz1993/p/6753454.html

C++ primer 第七章之 友元函数与友元类相关推荐

  1. 【C语言】第七章 模块化与函数 题解

    第七章 模块化与函数 1.略 2.代码如下: #include <stdio.h> #include <ctype.h>int isChar(char c) {if (isal ...

  2. 第七章 SQL聚合函数 LIST

    文章目录 第七章 SQL聚合函数 LIST 大纲 参数 描述 包含逗号的数据值 LIST 和 %SelectMode LIST 和 ORDER BY 最大列表大小 相关的聚合函数 示例 第七章 SQL ...

  3. C++友元:友元函数、友元类和友元成员函数

    Table of Contents 1.友元函数 2.友元类 3.友元成员函数 友元小结: 参考资料: 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例 ...

  4. c语言的友元函数的用法,C++友元函数和友元类概念解析

    一.友元函数 友元函数是一种特殊的函数,它需要在类体内进行说明,可以访问类的私有成员和保护成员,但又不是类的成员函数.友元函数的说明如下: friend 数据类型函数名(参数) 其中,friend是说 ...

  5. C++ 笔记(30)— 友元函数与友元类

    我们知道类的私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行.这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦. ...

  6. C++友元函数和友元类(C++ friend)详解

    在看VISP视觉库的时候遇到友元函数: Friends void swap (vpDetectorAprilTag &o1, vpDetectorAprilTag &o2) 在定义一个 ...

  7. 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况

    在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...

  8. c++友元函数与友元类

    友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...

  9. C++友元函数和友元类(一)

    在 C++ 中,一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们 ...

  10. friend之友元函数和友元类

    // friend_func.cpp : Defines the entry point for the console application. 写一个函数求两个点的中点 //友元函数可以访问类的私 ...

最新文章

  1. BF法-字符模式匹配
  2. P1965 夜夜的数据加强 题解
  3. 放弃Windows,用国产开源替换政府办公系统!这个国家做到了
  4. matlab接口与编程,精通MATLAB接口与编程
  5. set获取元素_C++与STL入门(4):关联容器:集合set
  6. session 拦截器中获取不到session值_拦截器实现登陆验证
  7. 递归法:财务金额漏掉1笔或者几笔(排列组合)
  8. 【TWVRP】基于matlab遗传算法求解带时间窗的含充电站车辆路径规划问题【含Matlab源码 1177期】
  9. 通过regedt查看计算机密码,教你操作电脑密码查看器 【解决办法】 的还原教程_...
  10. Silverlight Blend动画设计系列五:故事板(StoryBoards)和动画(Animation)
  11. 【笔记】两个根因分析方法:5WHYamp;10WHY
  12. 无线路由当交换机的设置方法
  13. [机器学习与scikit-learn-38]:算法-分类-支持向量机-通过等高线可视化决策边界线和隔离带
  14. 爬取《悲伤逆流成河》猫眼信息 | 郭敬明五年电影最动人之作
  15. Etcd Unable to attach or mount volumes
  16. 新版正方教务系统Java爬取_正方教务系统成绩爬取(仅个人)+tk可视化
  17. java使用poi导出ppt图表——环形图/空心饼图
  18. 主流币仍被摁在地上摩擦,平台币已扬起一场美丽的春梦
  19. baxter仿真操作简单命令
  20. Ambari源码二次开发实战课程(持续更新中)

热门文章

  1. 用伪代码模拟洗衣机的运转流程
  2. 2022-2028年中国多肽药物市场研究及前瞻分析报告
  3. 2022-2028年中国科技馆行业研究及前瞻分析报告
  4. 2022-2028年中国节能建材行业深度调研及投资前景预测报告
  5. Redis 笔记(09)— 过期时间 expire(设置、查询、取消过期时间)
  6. lightgbm 决策树 可视化 graphviz
  7. 聊一聊Spring中的线程安全性
  8. 云计算灾备原理与预防恢复方案
  9. MindSpore静态图语法支持
  10. NVIDIA TensorRT高性能深度学习推理