原文链接:http://www.cnblogs.com/CBDoctor/archive/2012/02/04/2337733.html

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

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

class  Data{
public:
...
friend  int set(int &m);//友元函数
friend  class peop;     //友元类
...
}

友元函数:

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

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

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

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

友元类

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

class A{…
public:friend class B;
…
};

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

使用友元类时注意:

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

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

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

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

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

//来自友元——互动百科
#include #include 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<<"("<}double Distance(Point &a, Point &b)  //注意函数名前未加类声明符{double dx = a.x - b.x;double dy = a.y - b.y;return sqrt(dx*dx+dy*dy);}void main(){Point p1(3.0, 4.0), p2(6.0, 8.0);p1.Getxy();p2.Getxy();double d = Distance(p1, p2);cout<<"Distance is"<}

转载于:https://www.cnblogs.com/cosmo89929/archive/2013/01/03/2842718.html

C++ 友元--friend (转载)相关推荐

  1. Cocos2d-x基础篇C++

    1.C++类和对象 类的公有成员可以使用成员访问运算符(.)访问. (::)是范围解析运算符.调用成员函数是在对象上使用(.)运算符. 2.C++继承(C++中父类称为基类,子类称为派生类) clas ...

  2. C++ primer 第七章之 友元函数与友元类

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

  3. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

    一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...

  4. C++中友元类使用场合

    在C++中我们可以將函数定义成类的友元函数,这样在函数中就可以访问类的私有成员.与函数相同,类也可以作为另一个类的友元类,在友元类中可以访问另外一个类的所有成员. 声明友元类的方法很简单,只需在类中写 ...

  5. 运算符中的二元重载,为什么要调用友元函数而不是全局函数的问题

    #include <iostream>using namespace std; //实现运算符的重载 class A { public:A(int real=0,int imaginary ...

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

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

  7. 练习友元函数,有元类,快排和全排列问题

    写了一小段代码: 练习一下友元类和友元函数的声明和使用: 练习一下最简单的快排算法: 练习一下递归的方法处理全排列问题. 代码: 1 #include <stdlib.h> 2 #incl ...

  8. [转载]C++ 面试

    原文地址:C++ 面试作者:老徐 1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与free是 ...

  9. 友元实例:友元类及友元函数

    学习了c++这么久,一直没有对友元进行了解,据说友元不是特别好用(据说,不是我说的),因此直到今天才去了解.其实友元确实不是很常用,但友元功能确实很实用,它不但能够释放类中的非公有成员,同时还能保证了 ...

最新文章

  1. oracle 状态unknown,解决Oracle crs_stat状态为UNKNOWN有关问题
  2. 基于深度卷积神经网络进行人脸识别的原理是什么?
  3. 工业级服务器销售电话,工业级服务器
  4. Sqoop import导入表时报错java.lang.ClassNotFoundException: org.json.JSONObject
  5. css 首字下沉 错位,css+div错位问题的修复小结
  6. 服务器性能优化之网络性能优化
  7. Why Opportunity list is empty
  8. Windows 消息ID及定义大全
  9. nodejs项目_多人群聊实现其实很简单:Nodejs+WebSocket+Vue轻松实现Web IM
  10. 深度学习(六十)网络压缩简单总结
  11. HDU1029——Ignatius and the Princess IV
  12. 大批量安装系统的解决方案(集锦)
  13. Linux学习(第十七周)
  14. linux系统交换分区的文件格式是,【简答题】Red Hat Linux中,交换分区的文件系统类型是什么,光盘文件的文件系统类型是什么?...
  15. Sun Dec 31 19:00:00 CST 1899格式的字符串转Date
  16. Cesium 地形图
  17. 批发记账本软件隐私政策
  18. OpenStreetMap开放街道图(OSM)
  19. 分享一下玩滑板的心得体会
  20. 【经验分享】设置电脑定时开关机

热门文章

  1. java 中文怎么截取,java String 中文 字符串 截取
  2. Matlab实用程序--图形应用-交互式图形
  3. zblogphp 广告联盟_停止折腾联盟广告样式,重新回归内容写作
  4. 改善程序的55个具体做法
  5. 【自动驾驶】毫米波雷达相关知识专题
  6. 【c++】15.订阅消息后转化为proto消息,再序列化,最后通过tcp发送出去
  7. cuda-convnet2与caffe对比
  8. 自己动手实现一个简单的JSON解析器
  9. Java设计模式透析之 —— 策略(Strategy)
  10. 从零开始学习jQuery (七) jQuery动画-让页面动起来!