王桂林讲C++之友元
王桂林老师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);
}
友元注意事项?
- 友元关系不能够被继承。
- 友元关系是单向的,不具有交换性。如果类A是类B的友元,那么类B不一定是类A的友元,要看类中是否有相关的声明。
- 友元关系不具备传递性。如果类A是类B的友元,类C是类A的友元,那么类C不一定是类B的友元,要看类中是否有相关的声明。
王桂林讲C++之友元相关推荐
- 王桂林讲C++之static
王桂林讲C++之static static在C语言中就已经存在,主要有以下几个用法: 定义为全局静态变量 不会被其他文件所访问,修改 其他文件中可以使用相同名字的变量,不会发生冲突 定义为局部静态变量 ...
- 王桂林讲C++之指向类成员指针
王桂林讲C++之指向类成员指针 对于普通变量或普通函数,我们可以使用一个指针指向它,然后很方便的通过指针调用它.例如, //变量指针 string str = "china"; s ...
- 华为工程师,带你实战C++(2016版)-王桂林-专题视频课程
华为工程师,带你实战C++(2016版)-52396人已学习 课程介绍 这是一套全面而系统的C++学习: 1,C++对C的全面提高(类型增强,函数重载,默认参数,引用,new/dele ...
- 5设计模式(基于C/C++实现)-王桂林-专题视频课程
<5>设计模式(基于C/C++实现)-814人已学习 课程介绍 当你有了一定的语言基础以后,对于软件的开发就要上升到设计阶段. 设计模式就是这样一门软件设计的课目.本课程, ...
- 3华为工程师 ,带你实战C++(2018版)-王桂林-专题视频课程
<3>华为工程师 ,带你实战C++(2018版)-1957人已学习 课程介绍 这是一套全面而系统的C++学习教程: 1,C++对C的全面提高(类型增强,函数重载,默认参数, ...
- 王桂林 C++基础与提高 练习题—— 函数做默认参数
在王桂林老师给的样例上稍微做了调整. 王老师给的样例是: typedef int(*Comp)(int, int); void popSort(int *p, int len, Comp com=as ...
- 4数据结构与算法(C/C++实现)视频教程-王桂林-专题视频课程
<4>数据结构与算法(C/C++实现)视频教程-1008人已学习 课程介绍 C/C++实现数据结构与算法视频培训课程全面介绍计算机行业,基本的数据结构与算法,既有理论的深度 ...
- 1C语言 从放弃到入门-王桂林-专题视频课程
<1>C语言 从放弃到入门-1052人已学习 课程介绍 C语言 从放弃到入门 课程收益 所有对C语言有入门恐惧的人. 讲师介绍 王桂林 更多讲师课程 ...
- 8Lua从入门到精通-王桂林-专题视频课程
<8>Lua从入门到精通-391人已学习 课程介绍 lua语言以其,轻量级: 可扩展,支持面向过程编程和函数式编程:自动内存管理:只提供了一种通用类型的表(table),用 ...
最新文章
- 网络存储空间_【百一案评】信息存储空间侵害作品信息网络传播权的认定——北京焦点公司诉北京百度公司侵害信息网络传播权纠纷案...
- (转) OpenLayers3基础教程——OL3 介绍control
- requirejs使用笔记
- zoj 1154 Niven numbers
- Nginx开启Gzip压缩配置详解
- ES6------Set结构
- selenium-webdriver——如何在启动firefox时加载扩展
- 优势java_Java的核心优势
- Python 实现单例模式的一些思考
- HttpClient、HttpURLConnection、OKHttp和Volley
- JAVA各种加密与解密方式(精挑版)
- wps ppt 如何批量换背景
- 《东周列国志》第三回 犬戎主大闹镐京 周平王东迁洛邑
- Linux 打开 Xbrowser 可视化操作界面
- 一点一点把CAN总线通信吃透
- 程序员应该每天写代码
- 一个好玩的辞职信HTML版
- 学术期刊划分(教你认识SCI、EI、SSCI、IEEE、CSSCI...)
- 分治法、动态规划、贪心算法区别
- 又一所“一流大学”北京航空航天大学和华为签约