王桂林老师C++之友元

友元,英语为friend,朋友的意思,朋友就是关系亲密的两个人,能够分享物品的两个人。
由此可见,友元在C++之中的作用,就是实现数据的方便访问。
本文将从下面三个方面来阐述friend的功能:

  • 在什么情况下,使用友元能够带来方便?
  • 友元可以修饰哪几种类型?
  • 友元注意事项?

在什么情况下,使用友元能够带来方便?

先举一个生活中的例子。A和B是借贷关系,每次A找B贷款,都需要得到B的同意,这样做很符合规矩。但是,有时候A频繁的找B借钱,这样B就频繁的接待A,很耽误自己的时间,而且也很麻烦。B就开始想办法解决这个麻烦,他觉得A值得信任,可以做他的朋友,于是就告诉A,以后你来找我借钱,就直接到一个地方拿,不需要经过我的允许。这样,麻烦就解决了。但是,也导致了不安全。
同样,在C++中,也是一样的道理。先定义一个类B:

//main.cpp
class B
{
public:int getX(){return x;}
private:int x;
};void func()
{B b;for (int i=0; i<10000; i++){std::cout<<b.getX()<<std::endl;  //只能通过接口访问类私有成员}
}

因为类的私有成员不能直接被访问,所以func函数访问B中的x,就必须要经过B的公共成员函数getX。但是如果将func声明为B的友元,则就可以通过B的对象直接访问x。修改如下,

class B
{
public:friend void func(B & b);  //友元函数声明(注意:友元函数不受public、private的影响,一般习惯放在public下)
private:int x;
};
//友元函数定义
void func(B & b)
{for (int i=0; i<10000; i++){std::cout<<b.x<<std::endl;     //直接通过类对象访问私有成员}
}

友元可以修饰哪几种类型?

从上一段中可以得知,全局函数可以成为类的友元。除了全局函数外,还有不同类的成员函数、类的对象都可以成为一个类的友元。

//A类的成员函数为B类的友元函数
//main.cpp
class B;   //因为类A中使用了B的引用,所以必须要在类A之前进行这种不完全声明。(注意:不完全声明后,只能使用其引用和指针。)
class A
{
public:int getadd(B & b);
};class B
{
public:friend int A::getadd(B & b);  //格式基本与全局函数声明一致,只是函数前加上类命名空间
private:int x;int y;
};int A::getadd(B & b)
{return (b.x + b.y);
}

假如类A的所有成员函数,都是去操作类B的成员变量。为了方便,可以直接把A声明为B的友元,这样就不需要一个函数一个函数的声明了。

//A类为B类的友元函数
//main.cpp
class B;
class A
{
public:int getadd(B & b);int getsub(B & b);
};class B
{
public:friend A;
private:int x;int y;
};int A::getadd(B & b)
{return (b.x + b.y);
}
int A::getsub(B & b)
{return (b.x - b.y);
}

友元注意事项?

  1. 友元关系不能够被继承。
  2. 友元关系是单向的,不具有交换性。如果类A是类B的友元,那么类B不一定是类A的友元,要看类中是否有相关的声明。
  3. 友元关系不具备传递性。如果类A是类B的友元,类C是类A的友元,那么类C不一定是类B的友元,要看类中是否有相关的声明。

王桂林讲C++之友元相关推荐

  1. 王桂林讲C++之static

    王桂林讲C++之static static在C语言中就已经存在,主要有以下几个用法: 定义为全局静态变量 不会被其他文件所访问,修改 其他文件中可以使用相同名字的变量,不会发生冲突 定义为局部静态变量 ...

  2. 王桂林讲C++之指向类成员指针

    王桂林讲C++之指向类成员指针 对于普通变量或普通函数,我们可以使用一个指针指向它,然后很方便的通过指针调用它.例如, //变量指针 string str = "china"; s ...

  3. 华为工程师,带你实战C++(2016版)-王桂林-专题视频课程

    华为工程师,带你实战C++(2016版)-52396人已学习 课程介绍         这是一套全面而系统的C++学习: 1,C++对C的全面提高(类型增强,函数重载,默认参数,引用,new/dele ...

  4. 5设计模式(基于C/C++实现)-王桂林-专题视频课程

    <5>设计模式(基于C/C++实现)-814人已学习 课程介绍         当你有了一定的语言基础以后,对于软件的开发就要上升到设计阶段. 设计模式就是这样一门软件设计的课目.本课程, ...

  5. 3华为工程师 ,带你实战C++(2018版)-王桂林-专题视频课程

    <3>华为工程师 ,带你实战C++(2018版)-1957人已学习 课程介绍         这是一套全面而系统的C++学习教程: 1,C++对C的全面提高(类型增强,函数重载,默认参数, ...

  6. 王桂林 C++基础与提高 练习题—— 函数做默认参数

    在王桂林老师给的样例上稍微做了调整. 王老师给的样例是: typedef int(*Comp)(int, int); void popSort(int *p, int len, Comp com=as ...

  7. 4数据结构与算法(C/C++实现)视频教程-王桂林-专题视频课程

    <4>数据结构与算法(C/C++实现)视频教程-1008人已学习 课程介绍         C/C++实现数据结构与算法视频培训课程全面介绍计算机行业,基本的数据结构与算法,既有理论的深度 ...

  8. 1C语言 从放弃到入门-王桂林-专题视频课程

    <1>C语言 从放弃到入门-1052人已学习 课程介绍         C语言 从放弃到入门 课程收益     所有对C语言有入门恐惧的人. 讲师介绍     王桂林 更多讲师课程     ...

  9. 8Lua从入门到精通-王桂林-专题视频课程

    <8>Lua从入门到精通-391人已学习 课程介绍         lua语言以其,轻量级: 可扩展,支持面向过程编程和函数式编程:自动内存管理:只提供了一种通用类型的表(table),用 ...

最新文章

  1. 网络存储空间_【百一案评】信息存储空间侵害作品信息网络传播权的认定——北京焦点公司诉北京百度公司侵害信息网络传播权纠纷案...
  2. (转) OpenLayers3基础教程——OL3 介绍control
  3. requirejs使用笔记
  4. zoj 1154 Niven numbers
  5. Nginx开启Gzip压缩配置详解
  6. ES6------Set结构
  7. selenium-webdriver——如何在启动firefox时加载扩展
  8. 优势java_Java的核心优势
  9. Python 实现单例模式的一些思考
  10. HttpClient、HttpURLConnection、OKHttp和Volley
  11. JAVA各种加密与解密方式(精挑版)
  12. wps ppt 如何批量换背景
  13. 《东周列国志》第三回 犬戎主大闹镐京 周平王东迁洛邑
  14. Linux 打开 Xbrowser 可视化操作界面
  15. 一点一点把CAN总线通信吃透
  16. 程序员应该每天写代码
  17. 一个好玩的辞职信HTML版
  18. 学术期刊划分(教你认识SCI、EI、SSCI、IEEE、CSSCI...)
  19. 分治法、动态规划、贪心算法区别
  20. 又一所“一流大学”北京航空航天大学和华为签约

热门文章

  1. python的编译器与解释器
  2. 使用Selenium含蓄等待获取页面元素(附带实际业务需求情景)
  3. 发布Jar到中央仓库报错 Remote staging failed: Staging rules failure!
  4. OCR 训练 中文语言包
  5. API 文档搜索引擎
  6. 【转】ReactOS的中文本地化
  7. 《底层逻辑》读书笔记
  8. 计算机怎么截音乐,qq音乐电脑版如何截取一段音乐
  9. Windows 7 系统虚拟机安装
  10. 计算机检索功能如何操作,请问如何设置电脑搜索