特点:

  • 能访问私有成员
  • 破坏封装性
  • 友元关系不可传递。若B是A的友元,C是B的友元,但C不一定是A的友元,要看类中是否有申明。
  • 友元关系的单向性。若A是B的友元,但B不一定是A的友元,要看类中是否申明。
  • 友元声明的形式及数量不受限制

为什么需要友元:

在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。

友元的作用:

友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

友元的三种实现:

  1. 全局函数做友元
#include <iostream>
#include <string>
using namespace std;
// 房屋类
class Building
{// 告诉编译器 laoWang全局函数是 Building类  的好朋友,可以访问Building对象的私有成员friend void laoWang1(Building *building);friend void laoWang2(Building &building);friend void laoWang3(Building building);
public:Building(){m_SittingRoom = "客厅";m_BedRoom = "卧室";}string m_SittingRoom;    // 客厅
private:string m_BedRoom;       // 卧室
};
//全局函数
void laoWang1(Building *building)
{cout << "隔壁老王 全局函数 正在访问:(地址传递) " << building->m_SittingRoom << endl;cout << "隔壁老王 全局函数 正在访问:(地址传递) " << building->m_BedRoom << endl;
}
void laoWang2(Building &building)
{cout << "隔壁老王 全局函数 正在访问:(引用传递) " << building.m_SittingRoom << endl;cout << "隔壁老王 全局函数 正在访问:(引用传递) " << building.m_BedRoom << endl;
}void laoWang3(Building building)
{cout << "隔壁老王 全局函数 正在访问:( 值传递 ) " << building.m_SittingRoom << endl;cout << "隔壁老王 全局函数 正在访问:( 值传递 ) " << building.m_BedRoom << endl;
}
void test()
{Building building;laoWang1(&building);laoWang2(building);laoWang3(building);
}
int main()
{test();
}
//结果:
//隔壁老王 全局函数 正在访问:(地址传递) 客厅
//隔壁老王 全局函数 正在访问:(地址传递) 卧室
//隔壁老王 全局函数 正在访问:(引用传递) 客厅
//隔壁老王 全局函数 正在访问:(引用传递) 卧室
//隔壁老王 全局函数 正在访问:( 值传递 ) 客厅
//隔壁老王 全局函数 正在访问:( 值传递 ) 卧室
  1. 类做友元
#include <iostream>
#include <string>
using namespace std;
// 类作友元
class Building;
class LaoWang
{
public:LaoWang();void visit();  //参观函数  访问Building中的属性Building * building;
private;
};
// 房屋类
class Building
{// 告诉编译器,LaoWang类是Building类的好朋友,可以访问Building类的私有成员friend class LaoWang;
public:Building();string m_SittingRoom; // 客厅
private:string m_BedRoom;       // 卧室
};
// 类外定义成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}
LaoWang::LaoWang()
{// 创建建筑物对象building = new Building;
}
void LaoWang::visit()
{cout << "隔壁老王LaoWang类正在访问:" << building->m_SittingRoom << endl;cout << "隔壁老王LaoWang类正在访问:" << building->m_BedRoom << endl;
}
void test()
{LaoWang lw;lw.visit();
}
int main()
{test();return 0;
}
//结果
//隔壁老王LaoWang类正在访问:客厅
//隔壁老王LaoWang类正在访问:卧室
  1. 成员函数做友元
#include <iostream>
#include <string>using namespace std;class Building;class LaoWang
{
public:LaoWang();void visit1(); //让visit1()函数   可以 访问Building中的私有成员void visit2();   //让visit2()函数 不可以 访问Building中的私有成员Building *building;private:};class Building
{// 告诉编译器,LaoWang类下的visit1()函数是Building类的好朋友,可以访问Building的私有成员friend void LaoWang::visit1();public:Building();string m_SittingRoom;   //客厅
private:string m_BedRoom;       //卧室
};LaoWang::LaoWang()
{building = new Building;
}void LaoWang::visit1()
{cout << "隔壁老王LaoWang类中的visit1()函数正在访问:" << building->m_SittingRoom << endl;cout << "隔壁老王LaoWang类中的visit1()函数正在访问:" << building->m_BedRoom << endl;
}void LaoWang::visit2()
{cout << "隔壁老王LaoWang类中的visit2()函数正在访问:" << building->m_SittingRoom << endl;//cout << "隔壁老王LaoWang类中的visit2()函数正在访问:" << building->m_BedRoom << endl;   //错误!私有属性不可访问
}Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}void test()
{LaoWang lw;lw.visit1();lw.visit2();
}int main()
{test();return 0;
}
//结果
//隔壁老王LaoWang类中的visit1()函数正在访问:客厅
//隔壁老王LaoWang类中的visit1()函数正在访问:卧室
//隔壁老王LaoWang类中的visit2()函数正在访问:客厅

C++友元类和友元函数相关推荐

  1. 【C++ 基础篇:21】:friend 友元四连问:什么是友元?友元类?友元函数?什么时候用友元?

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

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

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

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

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

  4. Th3.9:友元函数、友元类、友元成员函数详述

     本博客将记录:类的相关知识点的第9节的笔记! (这个在学习C++基础课程时已经学习过一次了,这里再次简单地回顾一下而已) 今天总结的知识分为以下3个点:   一.友元函数(对于非成员函数而言)   ...

  5. java友元类_友元实例:友元类及友元函数

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

  6. C++总结 友元类和友元函数

    在网上看到的文章, 写的挺全的,  具有总结性质. 于是转过来了.. 源地址(呵呵, 他也是转的)http://www.cnblogs.com/skyczw/archive/2008/05/27/12 ...

  7. java中友元类_友元类成员的依赖关系|循环依赖

    定义一个CBottle类,另一个类CCarton的某个成员对CBottle进行操作,因此在CBottle类中赋予CCarton成员的友元权利.我们很容易写出如下代码: //CBottle类的头文件 b ...

  8. java友元类_C++友元(Friend)用法实例简介

    相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的地方,供大家参考借鉴.希望能对初学C++的朋友起到一点帮 ...

  9. C++friend 友元类和友元函数

    •能访问私有成员 •破坏封装性 •友元关系不可传递 •友元关系的单向性 •友元声明的形式及数量不受限制

最新文章

  1. .Net魔法堂:史上最全的ActiveX开发教程——发布篇
  2. [转载]Array.prototype.slice.call(arguments,1)原理
  3. 第三章 python webdriver API(一)——浏览器操作
  4. 009_调色盘和高亮样式
  5. Java IO流操作规律
  6. 蓝桥杯 历届试题 小数第n位
  7. C语言程序设计基础讲座之函数
  8. mysql select效率_Mysql优化之selectcount效率_MySQL
  9. Upload-Labs(6-10)
  10. TCP/IP协议学习(五) 基于C# Socket的C/S模型
  11. OPPOA83_OPPOA83T_官方线刷包_救砖包_解账户锁
  12. ProCAD.2D/3D.Designer.v2008.1 1CD(最大程度地提高管道设计效率)\
  13. gmap 支持python吗_Python:地图上的标记标签使用gmap.marker_层使用hover_-tex选项不工作...
  14. NYOJ234吃土豆(双层动态规划)
  15. 《实践论》笔记及当下反思(一)
  16. 比较好的开源商城系统
  17. Markdown图片路径的改变方法
  18. Processing大作业——绘画系统
  19. 先锋系何以失控?去年6月起就已经出现资金链紧张的迹象
  20. mac系统常用操作指南

热门文章

  1. windows下使用winpcap-1.环境安装
  2. 《Unity API常用方法和类详细讲解—Siki学院》课程学习笔记03
  3. 窄带物联网(NB-IoT)基础知识
  4. 数据抓包(网络爬虫)-正方教务管理系统登录后获取自己的课程表
  5. 【重识云原生】第四章云网络4.3.10.6节——VXLAN应用部署方案
  6. 三维程序/游戏制作基本常识
  7. 四元数——为何使用四元数
  8. 这40款优质APP大合集,总有一个适合你! 1
  9. AxMath使用教程+常用符号与公式(持续更新中)
  10. http chunked