c++ 之 友元函数和友元类

友元(friend)其实就是好朋友的意思,我是你的好朋友,我就能访问你的所有对象的私有或公有成员。

但是友元会破坏数据的封装性,所以使用要慎重。

一、友元函数

如果友元是普通函数,则称友元函数。它不是当前类的成员函数。
位置可以放在任何部分(私有部分或共有部分)。
例1:一个类的友元函数

#include<iostream>
#include<cmath>
using namespace std;
class Point{private:double x,y;public:Point(double xx = 0.0, double yy = 0.0);void disp();friend double dis(const Point &p1,const Point &p2);  //友元函数
};
Point::Point(double xx, double yy){x = xx;y = yy;
}
void Point::disp(){cout<<x<<","<<y<<endl;
}
double dis(const Point &p1,const Point &p2){       //不用Point::,因为它不是成员函数return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
int main()
{Point p1(1,1),p2(2,2);p1.disp();p2.disp();cout<<dis(p1,p2)<<endl;return 0;
}

其中最好函数名不要用distance,原因链接:c++编译错误
例2:多个类的友元函数

#include<iostream>
#include<cmath>
using namespace std;
class Line;
class Point
{
private:double x, y;                  //x,y 坐标public: Point(double x=0.0, double y=0.0);void disp( );friend double dist(const Point& p,const Line& l); //声明为Point的友元
};
Point::Point (double x, double y){this->x = x;  this->y = y;
}
void  Point::disp( ){cout<<"点("<<x<<","<<y<<")";
}
class Line
{
private:double a, b, c;             //直线为ax+by+c=0的系数
public: Line(double a=0.0, double b=0.0, double c=0.0);void disp( );         friend double dist(const Point& p,const Line& l); //声明为Line的友元
};
Line::Line(double a, double b, double c){this->a = a;  this->b = b;  this->c = c;
}
void  Line::disp( ){  cout<<"线("<<a<<"x+"<<b<<"y+"<<c<<"=0)";
}
double dist(const Point& p,const Line& l){return fabs(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b);
}
int main(){Point p1(1.0,2.0);Line l1(3.0,4.0,5.0);p1.disp();l1.disp();cout<<"距离为:"<<dist(p1,l1)<<endl;return 0;
}

二、友元成员函数

#include<iostream>
#include<cmath>
using namespace std;
class Line;
class Point
{
private:double x, y;                  //x,y 坐标
public: Point(double x=0.0, double y=0.0);void disp( );double dist(Line l);  //声明为Point的成员
};
Point::Point (double x, double y){this->x = x;  this->y = y;
}
void  Point::disp( ){  cout<<"点("<<x<<","<<y<<")";
}
class Line
{
private:double a, b, c;             //直线为ax+by+c=0的系数
public: Line(double a=0.0, double b=0.0, double c=0.0);void disp( );friend double Point::dist(Line l); //声明为Line的友元
};
Line::Line(double a, double b, double c){this->a = a;  this->b = b;  this->c = c;
}
void  Line::disp( ){ cout<<"线("<<a<<"x+"<<b<<"y+"<<c<<"=0)";}
double Point::dist(Line l){return fabs(l.a*x+l.b*y+l.c)/sqrt(l.a*l.a+l.b*l.b);
}
int main()
{Point p1(1.0,2.0);Line l1(3.0,4.0,5.0);p1.disp();l1.disp();cout<<"距离为:"<<p1.dist(l1)<<endl;return 0;
}

三、友元类

#include<iostream>
#include<cmath>
using namespace std;
class Point
{
private:double x, y;                  //x,y 坐标
public: Point(double x=0.0, double y=0.0);void disp( );friend class ComputeTools; //声明为Point的友元类
};
Point::Point (double x, double y){this->x = x;  this->y = y;
}
void  Point::disp( ){  cout<<"点("<<x<<","<<y<<")";
}
class Line
{
private:double a, b, c;             //直线为ax+by+c=0的系数
public: Line(double a=0.0, double b=0.0, double c=0.0);void disp( );     // 输出私有变量的成员函数friend class ComputeTools; //声明为Line的友元类
};
Line::Line(double a, double b, double c){this->a = a;  this->b = b;  this->c = c;
}
void  Line::disp( ){  cout<<"线("<<a<<"x+"<<b<<"y+"<<c<<"=0)";
}
class ComputeTools  // Point and Line 的友元类
{
public:static double distance(Point p1,Point p2); //重载点与点距离static double distance(Point p,Line l); //重载点与直线距离
};
double ComputeTools::distance(Point p1,Point p2){return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double ComputeTools::distance(Point p,Line l){return fabs(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b);
}
int main(){Point p1(1.0,2.0),p2(3.0,4.0);   Line l1(3.0,4.0,5.0);p1.disp();     p2.disp();cout<<"距离为:"<<ComputeTools::distance(p1,p2)<<endl;p1.disp();   l1.disp();cout<<"距离为:"<<ComputeTools::distance(p1,l1)<<endl;return 0;
}

MyC++-learning-友元函数和友元类相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. C++语言基础(15)-友元函数和友元类

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

  8. C++ 友元(友元函数和友元类)

    友元的作用:提高了程序的运行效率(使得普通函数可以直接访问类的保护数据,避免了类成员函数的频繁调用,即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问 ...

  9. C++:友元(非成员友元函数、成员友元函数、友元类)

    3.8  友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的 ...

  10. c++远征之模板篇——友元函数、友元类

    以下内容源于慕课网的学习整理,如有侵权,请告知删除. 一.友元函数 1.分类 全局函数-->友元全局函数 成员函数-->友元成员函数 2.关键字friend 友元全局函数 如下,利用fri ...

最新文章

  1. 新内容转入github
  2. 13 登陆_13级!凌晨,“黑格比”登陆!对莆田的最新影响……
  3. 如何搭建MGRE——实验
  4. 【杂谈】白身,初识,不惑,有识,不可知,你处于深度学习工程师哪一重境界了...
  5. 【AVR ASF4库函数学习笔记】二、GPIO
  6. 苹果紧急修复远程漏洞,影响数十亿设备
  7. mergesort unrecursive 归并排序的非递归实现
  8. 在线教育市场为何因“最强雾霾”得利?
  9. QAM的符号能量及比特能量
  10. 写 Python 爬虫的助手
  11. 有源晶振引脚接法是什么样的?
  12. 二分法求中点最佳code写法
  13. FHS--文件系统结构
  14. emoji 表情图片解决方法
  15. 0基础916高分上岸东南大学—萤火学长黄金贴
  16. 易优cms foreach 数据循环输出标签
  17. 免费的Msql图形操作软件MySQL Workbench
  18. 第十一届“泰迪杯”数据挖掘挑战赛成绩公示
  19. 算法设计与分析--汽车牌照的快速查…
  20. 超全UI样机图片素材网站整理

热门文章

  1. 软件生命周期模型——瀑布模型
  2. tushare之“前复权”
  3. W ndowS无法自动修此计算机,系统引导怎么修复?电脑手动修复Windows系统引导文件...
  4. 中国移动苏州研发中心一面
  5. 安装打印机时提示操作无法完成(错误0×00000709)
  6. 上位机下位机概念详解
  7. 分享一下经常使用的 在线工具网站;如:在线是作图,抠图,格式转换等等…………
  8. Java EE初阶---网络原理之TCP_IP
  9. Mac OS X窗口操作快捷键
  10. 视频会议业务接力增长,“云+端”战略布局未来