当前位置: 首页 > news >正文

C++:一文搞懂友元类(friend class)

C++的友元(friend)是个很重要的概念,好些朋友对此却很迷惑,本文将对友元类(friend class)详细讲解,一文搞懂。

友元的特性:

1、使用friend修饰的友元类可以访问本类的私有成员(private)和保护成员(protected)。
2、友元不能传递,简单来说就是:她是我的朋友,他是她的朋友,但他不是我的朋友。

友元实例

大家都知道:正方形(Square)就是长和宽相等的长方形(Rectangle),本例中将以此为例,说明友元类的定义和使用。
源代码,仔细看注释内容:

#include <iostream>using namespace std;
/*** 友元类的定义和使用
*/
class Square; //先声明类,再使用class Rectangle { //定义长方形类Rectangleint height, width;
public:int area(){ //计算长方形的面积return height*width;}void convert(const Square& s); //声明成员方法,行尾必须加分号
};
class Square{ //定义正方形类Squarefriend class Rectangle; //声明Rectangle是Square的友元类,从而Rectangle类的对象可以访问Square的私有成员side,反过来不行。int side; //side是私有成员(private)
public:Square(int x):side(x){}  //完整定义了构造函数重载,所以行尾不用加分号
};
//定义Rectangle的成员方法convert()
void Rectangle::convert(const Square& s){ //参数s是Square类型的对象引用height = s.side; //友元关系,所以可以使用s的私有成员sidewidth = s.side; //使用s的私有成员side
}
int main(){Rectangle rect; //定义一个Rectangle类型的对象rectSquare sqr(4); //定义一个Square类型的对象sqrrect.convert(sqr); //调用rect的convert()方法将sqr正方形转换为等边的长方形cout << "Area is:" << rect.area() << endl; //调用长方形的面积函数area()计算面积return 0;
}

特别说明

在本例中,Rectangle是Square的友元类:
1、Rectangle类的对象可以访问Square的私有成员side;
2、反过来则不行,即:Square类的对象不能访问Rectangle对象的私有成员。

编译运行

D:\YcjWork\CppTour>gpp c2002D:\YcjWork\CppTour>g++ c2002.cpp -o c2002.exeD:\YcjWork\CppTour>c2002
Area is:16D:\YcjWork\CppTour>

运行截屏

C++:一文搞懂友元类(friend class)

(全文完)

相关文章:

  • SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器
  • uniapp中uni.request的统一封装 (ts版)
  • 【易上手快捷开发新框架技术】用Flet从零开始分步骤循序渐进编程实现购物清单助手手机应用app示例掰烂嚼碎深度讲解源代码IDE运行和调试通过截图为证
  • 低代码可视化-UniApp二维码可视化-代码生成器
  • 如何设计具体项目的数据库管理
  • 【网络安全】身份认证
  • Kafka学习笔记(一)Kafka基准测试、幂等性和事务、Java编程操作Kafka
  • leetcode力扣刷题系列——【座位预约管理系统】
  • OpenCV视频I/O(2)视频采集类VideoCapture之检索视频流的各种属性函数get()的使用
  • css的动画属性
  • 828华为云征文|部署音乐流媒体服务器 mStream
  • vue3学习记录-computed
  • ResNet50V2:口腔癌分类
  • C# MSTest 进行单元测试
  • 考研数据结构——顺序表代码题
  • [Vue CLI 3] 配置解析之 css.extract
  • HTTP请求重发
  • Linux后台研发超实用命令总结
  • React-Native - 收藏集 - 掘金
  • Tornado学习笔记(1)
  • 程序员该如何有效的找工作?
  • 记一次删除Git记录中的大文件的过程
  • 利用jquery编写加法运算验证码
  • 普通函数和构造函数的区别
  • 日剧·日综资源集合(建议收藏)
  • 如何进阶一名有竞争力的程序员?
  • 网络应用优化——时延与带宽
  • 微信开放平台全网发布【失败】的几点排查方法
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一些关于Rust在2019年的思考
  • 源码安装memcached和php memcache扩展
  • 转载:[译] 内容加速黑科技趣谈
  • 【干货分享】dos命令大全
  • 带你开发类似Pokemon Go的AR游戏
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 移动端高清、多屏适配方案
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (¥1011)-(一千零一拾一元整)输出
  • (12)Linux 常见的三种进程状态
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (实战篇)如何缓存数据
  • (四)Controller接口控制器详解(三)
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .aanva
  • .Family_物联网
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net Application的目录
  • .NET企业级应用架构设计系列之结尾篇
  • .NET中两种OCR方式对比
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复