C++友元类和友元函数
特点:
- 能访问私有成员
- 破坏封装性
- 友元关系不可传递。若B是A的友元,C是B的友元,但C不一定是A的友元,要看类中是否有申明。
- 友元关系的单向性。若A是B的友元,但B不一定是A的友元,要看类中是否申明。
- 友元声明的形式及数量不受限制
为什么需要友元:
在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。
友元的作用:
友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元的三种实现:
- 全局函数做友元
#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();
}
//结果:
//隔壁老王 全局函数 正在访问:(地址传递) 客厅
//隔壁老王 全局函数 正在访问:(地址传递) 卧室
//隔壁老王 全局函数 正在访问:(引用传递) 客厅
//隔壁老王 全局函数 正在访问:(引用传递) 卧室
//隔壁老王 全局函数 正在访问:( 值传递 ) 客厅
//隔壁老王 全局函数 正在访问:( 值传递 ) 卧室
- 类做友元
#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类正在访问:卧室
- 成员函数做友元
#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++友元类和友元函数相关推荐
- 【C++ 基础篇:21】:friend 友元四连问:什么是友元?友元类?友元函数?什么时候用友元?
本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...
- 友元实例:友元类及友元函数
学习了c++这么久,一直没有对友元进行了解,据说友元不是特别好用(据说,不是我说的),因此直到今天才去了解.其实友元确实不是很常用,但友元功能确实很实用,它不但能够释放类中的非公有成员,同时还能保证了 ...
- C++友元:友元函数、友元类和友元成员函数
Table of Contents 1.友元函数 2.友元类 3.友元成员函数 友元小结: 参考资料: 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例 ...
- Th3.9:友元函数、友元类、友元成员函数详述
本博客将记录:类的相关知识点的第9节的笔记! (这个在学习C++基础课程时已经学习过一次了,这里再次简单地回顾一下而已) 今天总结的知识分为以下3个点: 一.友元函数(对于非成员函数而言) ...
- java友元类_友元实例:友元类及友元函数
学习了c++这么久,一直没有对友元进行了解,据说友元不是特别好用(据说,不是我说的),因此直到今天才去了解.其实友元确实不是很常用,但友元功能确实很实用,它不但能够释放类中的非公有成员,同时还能保证了 ...
- C++总结 友元类和友元函数
在网上看到的文章, 写的挺全的, 具有总结性质. 于是转过来了.. 源地址(呵呵, 他也是转的)http://www.cnblogs.com/skyczw/archive/2008/05/27/12 ...
- java中友元类_友元类成员的依赖关系|循环依赖
定义一个CBottle类,另一个类CCarton的某个成员对CBottle进行操作,因此在CBottle类中赋予CCarton成员的友元权利.我们很容易写出如下代码: //CBottle类的头文件 b ...
- java友元类_C++友元(Friend)用法实例简介
相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的地方,供大家参考借鉴.希望能对初学C++的朋友起到一点帮 ...
- C++friend 友元类和友元函数
•能访问私有成员 •破坏封装性 •友元关系不可传递 •友元关系的单向性 •友元声明的形式及数量不受限制
最新文章
- .Net魔法堂:史上最全的ActiveX开发教程——发布篇
- [转载]Array.prototype.slice.call(arguments,1)原理
- 第三章 python webdriver API(一)——浏览器操作
- 009_调色盘和高亮样式
- Java IO流操作规律
- 蓝桥杯 历届试题 小数第n位
- C语言程序设计基础讲座之函数
- mysql select效率_Mysql优化之selectcount效率_MySQL
- Upload-Labs(6-10)
- TCP/IP协议学习(五) 基于C# Socket的C/S模型
- OPPOA83_OPPOA83T_官方线刷包_救砖包_解账户锁
- ProCAD.2D/3D.Designer.v2008.1 1CD(最大程度地提高管道设计效率)\
- gmap 支持python吗_Python:地图上的标记标签使用gmap.marker_层使用hover_-tex选项不工作...
- NYOJ234吃土豆(双层动态规划)
- 《实践论》笔记及当下反思(一)
- 比较好的开源商城系统
- Markdown图片路径的改变方法
- Processing大作业——绘画系统
- 先锋系何以失控?去年6月起就已经出现资金链紧张的迹象
- mac系统常用操作指南