c++ 中友元函数的用法

时间: 2023-12-01 14:03:22 浏览: 44
C++中的友元函数是指可以访问类的私有成员的非成员函数。友元函数可以在类定义中进行声明,并在类外进行定义。其主要用途是提高程序的封装性和安全性。友元函数的声明格式为:friend 返回值类型 函数名(参数列表);友元函数的定义格式为:返回值类型 类名::函数名(参数列表){ }。可以通过使用友元函数来访问类的私有成员,但需要注意的是过度使用友元函数可能会降低类的封装性和安全性。
相关问题

c++中友元函数前置

C++中的友元函数前置声明是指在类中声明一个函数为友元函数,以便该函数可以访问该类的私有成员。在类中声明友元函数时,需要在函数名前加上关键字“friend”,并在类的声明中进行前置声明。这样,即使该函数在类的定义之后,也可以正常使用。友元函数前置声明的语法格式如下: class MyClass { friend void myFriendFunction(); // 前置声明友元函数 }; 需要注意的是,友元函数前置声明只是告诉编译器该函数是该类的友元函数,但并不会定义该函数的实现。因此,在类的定义之外还需要定义该函数的实现。

c++中友元类中的函数调用

元类是指在一个类中将另一个类声明为友元,使得被声明的类可以访问友元类中的私有成员。在C++中,友元类中的函数调用与友元函数类似,只不过是将另一个类声明为友元类,而不是友元函数。在友元类中,可以访问被声明为友元的类的私有成员,从而实现一些特殊的操作。 下面是一个友元类的例子: ``` class A { private: int data; public: A(int d) : data(d) {} friend class B; // 将类B声明为友元类 }; class B { public: void showA(A& a) { cout << a.data << endl; // 可以访问类A的私有成员data } }; int main() { A a(10); B b; b.showA(a); // 输出10 return 0; } ```

相关推荐

#include<iostream> using namespace std; class student { public: //友元函数可以访问类中的公有和私有成员,不可以访问保护成员 friend void func2(student& s); friend class teacher; int a = 10; student(int x); ~student(); void func3(); private: int b = 20; }; student::student(int x) :a(x) { cout << "student 构造函数调用1" << endl; } student::~student() { cout << "student 析构函数调用!" << endl; } void student::func3() { cout << b << endl; } class teacher { public: int a = 1; student p; teacher(int a); ~teacher(); }; teacher::teacher(int a) { cout << "teacher构造函数调用" << endl; this->a = a; // p = new student(100); } teacher::~teacher() { cout << "teacher析构函数调用" << endl; // delete p; } void func1() { student s1(100); cout << s1.a << endl; s1.func3(); func2(s1); cout << s1.a << endl; } //友元函数,全局函数做友元 //在形参中加入const防止传入的参数被改变,不加const则可以改变 void func2( student &s) { //传入普通类对象不可以改变类中的值,只能改变形参类的值 /*s.a = 123; cout<<s.a << endl; cout << s.b << endl;*/ ////传入指针可以改变类的值 /*s->a = 1000; s->b = 123; cout << s->a << endl; cout << s->b << endl;*/ ///传入引用也可以改变类中的值 //s.a = 12345; //s.b = 123456; cout << s.a << endl; cout << s.b << endl; } //类做友元 void func3() { student s1(10); cout << s1.a << endl; teacher t1(100); cout << t1.a << endl; //t1.p->a = 123456; cout << t1.p.a<< endl; } int main() { //成员函数做友元 //func1(); //类做友元 func3(); system("pause"); return 0; }

最新推荐

recommend-type

财务日常记账表.xlsx

工资表,财务报表,对账表,付款申请,财务报告,费用支出表,财务收支 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。
recommend-type

基于C#实现慕.课线上批改作业源码+文档说明+界面演示 (超级简单版期末大作业)

<项目介绍> 基于C#实现慕.课线上批改作业源码+文档说明+界面演示 (超级简单版期末大作业) - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
recommend-type

HW营销人力资源体系.pptx

HW营销人力资源体系.pptx
recommend-type

机器学习资源大全中文版,包括机器学习领域的框架、库以及软件

机器学习资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理。awesome-machine-learning 就是 josephmisiti 发起维护的机器学习资源列表,内容包括了机器学习领域的框架、库以及软件(按编程语言排序)。 Awesome 系列虽然挺全,但基本只对收录的资源做了极为简要的介绍,如果有更详细的中文介绍,对相应开发者的帮助会更大。这也是我们发起这个开源项目的初衷。
recommend-type

Linux命令行与shell脚本编程大全案例 (13).zip

linux常用命令大全
recommend-type

新闻发布系统:第二阶段——实现一级标题发布

在这个"新闻发布系统"的第二阶段项目中,主要目标是实现一级标题的发布功能。开发人员需要编写JSP(JavaServer Pages)脚本,这是Java Web应用中的动态网页技术,用于生成客户端浏览器可见的HTML内容。同时,需要编写Servlet,这是一种特殊的Java类,用于处理HTTP请求并生成响应,是服务器端的逻辑处理核心。 在这一阶段,关键的任务包括: 1. **JSP编写**:开发者需熟练运用JSP语法,利用内置对象如session和page来存储和管理用户状态信息,并使用JSP指令如include和page来组织代码结构,提高代码复用性。 2. **Servlet开发**:掌握Servlet的生命周期,包括初始化、服务请求、处理请求、销毁等各个阶段。理解如何使用HttpServletRequest, HttpServletResponse和HttpSession对象来与客户端进行交互,以及如何控制页面转向。 3. **数据操作**:设计并实现程序,将一级标题对象的属性(如编号、标题名、创建者和时间)持久化到FirstLevelTitle数据库表中。这涉及到数据库连接和SQL操作。 4. **解决问题**:在整个开发过程中,鼓励独立思考和解决问题,而不是单纯依赖预设的解决方案或模板,以提升自己的编程技能和问题解决能力。 阶段划分明确,分为四个阶段: - 第一阶段:数据库设计和实现,包括创建news数据库,以及FirstLevelTitle和SecondLevelTitle两个表,使用直连方式连接数据库。 - 第二阶段:专注于一级标题的发布功能,这是当前的重点。 - 第三阶段:扩展到二级标题的发布,同样涉及JSP和Servlet的编写。 - 第四阶段:完成新闻发布系统的前端展示,实现新闻内容的查询和显示,可能还包括数据库访问程序的编写。 难点解析部分强调了MVC(Model-View-Controller)模式的理解,以及JSP中内置对象的使用和JSP指令的应用。对于Servlet,需要掌握其生命周期管理以及与HTTP请求的交互。 整个项目要求参与者在实践中不断学习和成长,通过实际编码解决问题,提升自己的编程和系统设计能力。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

物体识别算法在ROS中的应用案例:探索机器人视觉的实际应用

![物体识别算法在ROS中的应用案例:探索机器人视觉的实际应用](https://www.guyuehome.com/Uploads/wp/2016/02/1.png) # 1. 物体识别算法概述** 物体识别算法是一类计算机视觉算法,用于从图像或视频中识别和定位物体。这些算法通常采用机器学习技术,通过分析图像中的特征来检测和分类物体。物体识别算法在机器人技术、自动驾驶和工业自动化等领域有着广泛的应用。 常见的物体识别算法包括: * **基于区域的算法:**这些算法将图像分割成区域,并分析每个区域的特征来识别物体。 * **基于边缘的算法:**这些算法检测图像中的边缘,并使用边缘信息来识
recommend-type

stm32G474RET6

STM32G474RET6是一款基于Arm Cortex-M4F内核的微控制器,由STMicroelectronics(ST)公司生产。它是STM32G4系列的一部分,专为低功耗和高性能应用设计,特别适合于物联网(IoT)、工业自动化、嵌入式系统和电池供电设备。 该芯片的主要特点包括: - 高性能:运行速度高达80MHz,提供了足够的计算能力执行复杂的任务。 - 能效优化:支持多种省电模式,如LPWR、HSE和ULP等,延长电池寿命。 - 大内存:内置Flash存储器容量较大,通常有512KB至2MB不等,以及RAM大小范围。 - 高速通信接口:支持多种外设接口,如USART、SPI、I2C
recommend-type

自定义新闻发布系统的第三阶段:二级标题发布与编码实战

在这个关于新闻发布系统的第三阶段开发任务中,目标是实现二级标题的发布功能。首先,你需要熟练掌握Java技术栈,特别是JSP(JavaServer Pages)和Servlet的运用,因为它们是构建Web应用的核心组件。JSP负责动态网页的呈现,利用内置对象如session和page来管理会话状态和页面内容。JSP指令如include和page则用于引入和操作页面元素。 Servlet作为服务器端的处理程序,理解其生命周期以及如何处理HttpRequest、HttpResponse和HttpSession是关键。页面转向的控制,包括重定向和请求转发,也是不可或缺的一部分。此外,你需要熟悉web.xml配置文件,它是Servlet容器用来部署和管理Servlet的元数据。 具体到本阶段的任务,你需要编写相关的JSP和Servlet代码,以实现二级标题信息的录入和存储,即往SecondLevelTitle表中写入数据。这涉及数据验证、业务逻辑处理以及与数据库交互。在整个过程中,鼓励独立思考和实践,遇到问题时主动解决,不断调试和优化代码。 数据库设计方面,已提到的news数据库中包含了FirstLevelTitle和SecondLevelTitle两个表,用于存储一级标题和二级标题的相关信息,如编号、标题名、创建者、创建时间和关联关系。第一阶段的任务重点在于设计和实现数据库,而第三阶段则是将这些设计转化为实际的代码实现。 在编码时,你需要遵循MVC(Model-View-Controller)模式,合理划分职责,确保系统的结构清晰,易于维护。同时,注意界面的显示和新闻内容的链接功能,使得用户能够方便地查看新闻详情。 这个阶段的目标是深化对Java Web开发的理解,提升编程能力和问题解决能力,同时也考验了数据库操作和前后端协作的技巧。通过完成这些任务,你将能构建一个功能完备的新闻发布系统。