C++ 重点内容:友元

目录

友元函数:

友元成员函数:

友元类:

友元是否有悖于OOP?

总结:

  • 类因为具有封装信息隐藏的特性(类外函数无法访问类的私有、保护成员,C++提出友元解决特定的编程需要;
  • 友元分为三类:友元函数、友元成员函数、友元类
  • 类中友元虽然不是类的成员函数,但是可以访问类的私有成员

友元函数:

友元函数既可以是一个不属于任何类的普通函数也可以是一个类的成员函数,友元函数可以访问类的私有成员(private)保护成员(protected)

普通函数作为友元函数:

friend 返回值类型 函数名 (参数列表)
class B
{
private :
	int a;
	int b;
protected:
	int aa;
public:
	int c;
	B(int i=1, int j=2,int k=3,int t=4) :a(i), b(j) ,c(k),aa(t){};
	void show(){ cout << "a:" << a << ",b:" << b << ",c:" << c << ",aa:" << aa << endl; }
	friend void geta(B& b1);//友元函数
};

void geta(B& b1) //B 的友元函数
{
	cout << "class B 的私有成员a:" << b1.a << endl;
	cout << "class B 的保护成员aa:" << b1.aa<< endl;
}
int main()
{
	B b;
	b.show();
	geta(b);
}

友元成员函数:

友元成员函数格式 相比 友元函数,多了类名::限定

friend 返回值类型 类名::函数名(参数列表);

代码示例,一个类的成员函数访问另一个类的私有成员

//友元成员函数:
class peo;
class th//销售产品:
{
	int banana;
	int apple;
public:
    th(int a=5, int b=4) :banana(b), apple(a) {};//构造函数 初始化
	int sum(const peo& p);//求销售总额
};
class peo//销售人数
{
private:
	int b_p;
	int a_p;
public:
	peo(int a = 4, int b = 5) :b_p(b), a_p(a) {};
	friend int th::sum(const peo& p);//类的成员函数声明为友元成员函数
};
int th::sum(const peo& p)
{
	return  p.a_p * apple + p.b_p * banana;
}

int main()
{
	peo a;
	th b;
	cout << "销售总额为:"<<b.sum(a) << endl;
}

友元类:

A 中所有的成员函数都想访问 类B中的私有和保护成员,则在类B 中声明 类A为其的友元类。

在哪个中声明,哪个类就被访问

友元类 有另一种较为繁琐的实现方式:将类A 所有的成员函数声明为 B 的友元成员函数。

friend class 类名
//友元类
class Date //日期类
{
private:
    int year;
    int month;
    int day;
public:
    Date(int y=0, int m=0, int d=0) :year(y), month(m), day(d)
    {}
    friend class DateFriend; //友元类,DateFriend是自己(Date类)的友元类
};

class DateFriend
{
public:
    void modifyDate(Date& date, int year, int month, int day);//修改日期
    void show(const Date& date);//输出数据
};

void DateFriend::modifyDate(Date& date, int year, int month, int day)//修改日期
{
    date.day = day;
    date.month = month;
    date.year = year;
}
void DateFriend::show(const Date& date)//输出数据
{
    cout << date.year << "-" << date.month << "-" << date.day<<endl;
}
int main()
{
    Date a(2023, 12, 20);
    DateFriend b;
    b.show(a);
    b.modifyDate(a,2024,1, 26);
    b.show(a);
    return 0;
}

友元是否有悖于OOP?

友元机制允许非成员函数访问保护成员、私有成员(违反了OOP数据隐藏原则)?

解答:

友元任然遵循OOP :友元函数可看做类的扩展接口的组成部分,每次友元的声明都在类内,即在类有控制与选择的基础上声明友元,类自愿将私有保护成员分享给被声明的类或者函数,使得该函数有权限访问类外函数无法访问的数据(声明类被访问),并没有破坏OPP。

总结:

类的友元函数:函数访问类内私有、保护成员
类的成员友元函数:
类的友元类:友元类访问类内私有、保护成员

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/350295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络的体系结构的各层在整个过程中起到什么作用?

ps&#xff1a;本文章的图片内容来源都是来自于湖科大教书匠的视频&#xff0c;声明&#xff1a;仅供自己复习&#xff0c;里面加上了自己的理解 这里附上视频链接地址&#xff1a;1.6 计算机网络体系结构&#xff08;4&#xff09;—专用术语_哔哩哔哩_bilibili 目录 &#x…

day3C++

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using namespace std;clas…

阿里云幻兽帕鲁服务器创建和配置教程

如何自建幻兽帕鲁服务器&#xff1f;基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了&#xff0c;一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器&#xff0c;阿里云百科aliyunbaike.com分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程&…

静态独享长效IP的优点有哪些?静态独享长效IP有哪些应用场景?

随着互联网的不断发展&#xff0c;IP地址作为网络通信中的重要标识&#xff0c;其重要性日益凸显。静态独享长效IP作为一种特殊的IP地址类型&#xff0c;具有许多优点&#xff0c;适用于多种应用场景。本文将详细介绍静态独享长效IP的优点以及适用场景。 一、静态独享长效IP的优…

Unity之动画和角色控制

目录 &#x1f4d5; 一、动画 1.创建最简单的动画 2.动画控制器 &#x1f4d5;二、把动画和角色控制相结合 &#x1f4d5;三、实现实例 3.1 鼠标控制角色视角旋转 3.2 拖尾效果 &#x1f4d5;四、混合动画 最近学到动画了&#xff0c;顺便把之前创建的地形&#xff0…

数据库练习

练习题目 创建职工表以及职工工资表 职工表字段&#xff1a;工号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄 工资表字段&#xff1a;编号自增&#xff0c;职工工号&#xff0c;基础工资10000 通过触发器实现&#xff1a; 对职工进行添加时&#xff1a; 工资表中也要体现…

Vue2学习之第六、七章——vue-router与ElementUI组件库

路由 理解&#xff1a; 一个路由&#xff08;route&#xff09;就是一组映射关系&#xff08;key - value&#xff09;&#xff0c;多个路由需要路由器&#xff08;router&#xff09;进行管理。前端路由&#xff1a;key是路径&#xff0c;value是组件。 1.基本使用 安装vue-…

水滴邮件营销:让企业营销更简单、更高效

企业在利用邮件开发客户、推广产品的时候&#xff0c;最终目的是想产生转化&#xff0c;获得收益。邮件营销有他得天独厚的优势&#xff0c;它为买卖双方提供了一个交流平台&#xff0c;并且只要收件人同意&#xff0c;企业就可以长期对其进行个性化营销。这为企业积累长期忠实…

vue实现在线Excel表格功能

目录 1.安装x-data-spreadsheet xlsx 2.引入 3.使用 1.安装x-data-spreadsheet xlsx npm i x-data-spreadsheet xlsx2.引入 import zhCN from "x-data-spreadsheet/src/locale/zh-cn"; import Spreadsheet from "x-data-spreadsheet"; import * as X…

CSS之webkit内核中的属性text-stroke

让我为大家介绍一下text-stroke 大家是否想过要弄一个描边过的文字&#xff0c;接下来&#xff0c;text-stroke就可以为你解决 text-stroke是一个复合属性&#xff0c;里面有两个参数&#xff1a;描边的尺寸 描边的颜色 <!DOCTYPE html> <html lang"en">…

【PCL】(六)点云矩阵变换

【PCL】&#xff08;六&#xff09;点云矩阵变换 以下代码实现使用Eigen库定义的4x4矩阵对从PCD或PLY文件加载的点云进行旋转和平移变换&#xff0c;并显示原始和变换后的点云。 matrix_transform.cpp&#xff1a; #include <iostream> #include <pcl/io/pcd_io.h&…

Java 字符串 05 练习-遍历字符串和统计字符个数

代码&#xff1a; import java.util.Scanner; public class practice{public static void main(String[] args) {//键盘录入一个字符串&#xff0c;并进行遍历&#xff1b;Scanner input new Scanner(System.in);System.out.println("输入一个字符串&#xff1a;")…

springboot347基于web的铁路订票管理系统

获取源码——》公主号&#xff1a;计算机专业毕设大全

Linux:用户切换指令su

相关文章 Linux专栏https://blog.csdn.net/weixin_45791458/category_12234591.html su是一个常用的用户切换命令&#xff0c; 用于在不同的用户身份之间切换&#xff0c;下面是它的用法。 用法&#xff1a; su [-] [-lmpVh] [-s shell] [-c command] [-w list] [username] 选…

快来pick你喜欢的布袋式压风自救装置

拼搏奋斗&#xff0c;追逐梦想&#xff0c;让我们一起努力&#xff0c;成为更好的自己。在人生的道路上&#xff0c;我们会遇到各种挫折和困难。但只要我们积极面对&#xff0c;勇敢前进&#xff0c;一切皆有可能。让我们一起用正能量的心态去迎接每一个新的挑战&#xff01;无…

HarmonyOS 鸿蒙应用开发( 六、实现自定义弹窗CustomDialog)

自定义弹窗&#xff08;CustomDialog&#xff09;可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗。具体用法请参考自定义弹窗。 在应用的使用和开发中&#xff0c;弹窗是一个很常见的场景&#xff0c;自定义弹窗…

封装qms三级物料多选组件

qms项目中的物料数据有很多&#xff0c;若是直接通过select下拉展示&#xff0c;首先是数据太多&#xff0c;会卡住&#xff0c;然后展示的内容也不全&#xff0c;目前物料有三个层级&#xff0c;分别一级物料、二级物料、三级物料&#xff0c;若是多加几个筛选条件&#xff0c…

Mysql 学习(十 四)事务简介

为什么要有事务&#xff1f; 数据库的出现其实是有应用场景的&#xff0c;最好的例子就是交易&#xff0c;以前的交易是通过账本记录的&#xff0c;也就是通过纸和笔来记录&#xff0c;而数据库的出现大大提升了效率&#xff0c;但是现实中的有些问题&#xff0c;数据库也需要…

基于Grafana+Prometheus搭建可视化监控系统实践

基本介绍 Grafana&#xff1a;一个监控仪表系统&#xff0c;可以根据提供的监控数据&#xff0c;生产可视化仪表盘&#xff0c;同时也具有告警通知功能。这里的监控数据来源&#xff0c;目前主要以Prometheus为主&#xff08;也支持其它数据源&#xff09;&#xff0c;每次展现…

1.26 day3 C++

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using namespace std; cla…