友元的学习

news2024/12/23 18:29:44

😁友元的简介

类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部作用域之外访问,但是,有时候需要在类的外部访问类的私有成员,这个时候就需要使用友元函数。

友元函数是一种特权函数,c++允许这哥特权函数访问私有成员,这一点从现实生活中也可以很好的理解,比如你的加,有客厅,有你的卧室,那么你的客厅是 public 的,所有来的人都可以进去,但是你的卧室是私有的,也就是说你能进去,但是你也可以允许你的闺蜜和好友进去。因此,我们可以把一个全局函数、某一个类中的成员函数、甚至整个类声明为 友元

😁友元的语法

使用 friend 关键字声明友元。

friend 关键字只出现在声明处,一个函数或者类作为了另一个类的友元,那么这个函数或者类就可以直接访问另一个类的私有数据

友元主要用在运算符重载上

😁普通全局函数作为类的友元

全局函数访问 Room 类的私有属性编译报错

设置普通全局函数作为类的友元

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;
class Room
{
    friend void visit(Room &room);
private:
    string bedRoom;   //卧室
public:
    string setingRoom; //客厅
public:
    Room(string bedRoom,string setingRoom){
        this->bedRoom = bedRoom;
        this->setingRoom = setingRoom;
    }
};

//全局函数
void visit(Room &room){
    cout<<"访问了:"<<room.setingRoom<<endl;
    cout<<"访问了:"<<room.bedRoom<<endl;
}

int main(int argc, char *argv[])
{
    Room room("卧室","客厅");
    visit(room);
    return 0;
}

编译成功

😁类的成员函数作为另一个类的友元

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;
class Room;
class Person{
public:
    void p_visit_1(Room &room);
    void p_visit_2(Room &room);
};

class Room
{
    friend void Person::p_visit_1(Room &room);
    friend void Person::p_visit_2(Room &room);
private:
    string bedRoom;   //卧室
public:
    string setingRoom; //客厅
public:
    Room(string bedRoom,string setingRoom){
        this->bedRoom = bedRoom;
        this->setingRoom = setingRoom;
    }
};

void Person::p_visit_1(Room &room)
{
    cout<<"访问了:"<<room.setingRoom<<endl;
    cout<<"访问了:"<<room.bedRoom<<endl;
}

void Person::p_visit_2(Room &room)
{
    cout<<"访问了:"<<room.setingRoom<<endl;
    cout<<"访问了:"<<room.bedRoom<<endl;
}

int main(int argc, char *argv[])
{
    Room room("卧室","客厅");
    Person p1;
    p1.p_visit_1(room);
    p1.p_visit_2(room);
    return 0;
}

另一个类的成员函数作为当前类的友元

编译成功!

😁整个类作为友元

上面的代码如果另一个类的成员函数作为当前类的友元比较麻烦,因此可以直接将整个类作为当前类的友元

😱注意事项

友元关系不能被继承

友元关系是单向的,类 A 是类 B 的朋友,但是 类 B 不一定是 类 A 的朋友‘’

友元关系不具有传递性,类 B 是 类 A 的朋友,类 C 是 类 B 的朋友,但是 类 C 不一定是 类 A 的朋友

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享在线预约系统制作步骤_在线预约链接怎么做

在微信小程序上进行在线预约&#xff0c;不管是商家还是顾客&#xff0c;都可以自由选择时间&#xff0c;顾客还可以通过预约小程序&#xff0c;了解到所选服务的详情和功能特色&#xff0c;不必等到去店内听介绍&#xff0c;顾客能节省等候时间&#xff0c;商家能解放招待人力…

解决:Vmware Workstation 和 Vmware ESXI 创建虚拟机Ubuntu20.04时界面显示不全,无法点击Continue进行下一步

目录 Vmware Workstation Vmware ESXI Vmware Workstation 1.如下图&#xff0c;到了这一步可以按 CTRL ALT T 调出命令终端 2. 终端输入 xrandr --size 1280x800 此命令是调整屏幕大小 3.此时已经显示屏幕完整信息 Vmware ESXI 安装workstation时那种调整界面大小的方…

每日学术速递2.21

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.T2I-Adapter: Learning Adapters to Dig out More Controllable Ability for Text-to-Image Diffusion Models 标题&#xff1a;T2I-Adapter&#xff1a;学习Adapter&#xff0c;为…

2022年网络安全政策态势分析与2023年立法趋势

近日&#xff0c;公安部第三研究所网络安全法律研究中心与 360 集团法务中心联合共同发布了《全球网络安全政策法律发展年度报告&#xff08;2022&#xff09;》。《报告》概览2022年全球网络安全形势与政策法律态势&#xff0c;并对2023年及后续短期内网络安全政策、立法趋势进…

【微信小程序】原生微信小程序ts模板下引入vant weapp

之前一直是在普通项目下使用 vant weapp&#xff0c;这不最近学了ts&#xff0c;使用微信开发工具的tsless初始化项目&#xff0c;再引入 vant 时踩了好久坑&#xff0c;特来记录一下 前言 本文章适合微信开发工具的ts项目&#xff0c;指的是项目目录结构如下图 总结 从上图…

Leetcode.1401 圆和矩形是否有重叠

题目链接 Leetcode.1401 圆和矩形是否有重叠 Rating &#xff1a; 1709 题目描述 给你一个以 (radius, xCenter, yCenter)表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2)&#xff0c;其中 (x1, y1)是矩形左下角的坐标&#xff0c;而 (x2, y2)是右上角的坐标。 如果圆和矩…

【重点掌握】Java基础之Javaweb核心技术详解

都说一入Java深似海&#xff0c;从此代码是爱人&#xff0c;但是学习的过程却从来都不轻松。当下&#xff0c;越来越多的互联网企业&#xff0c;招聘Java工程师时&#xff0c;明确写道需熟练掌握JavaWeb技术。作为衔接前后端的重要一环&#xff0c;JavaWeb技术已成为程序员向大…

Linux线程调度实验

Linux线程调度实验 1.获取线程属性 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <pthread.h> #include <time.h> #include <stdlib.h> #include <errno.h> #define _GNU_SOURCE#define handle_error…

Power Apps 中判断用户的SharePoint Online Group权限

前言 最近&#xff0c;碰到一个棘手的问题&#xff0c;就是用户有个需求&#xff0c;就是想在Power Apps中判断一个用户是不是在某些AD安全组中。 通常&#xff0c;这样的情况&#xff0c;都需要去AAD中进行判断&#xff0c;判断这个人在不在某些组中&#xff0c;有Graph API可…

双因素方差分析全流程

上篇文章讲述了“单因素方差分析全流程总结”&#xff0c;单因素方差分析只是考虑了一个自变量&#xff08;定类&#xff09;与一个因变量&#xff08;定量&#xff09;之间的关系&#xff0c;但是在实际问题研究中可能研究两个或者几个因素与因变量之间的关系&#xff0c;例如…

监管持续,医疗卫生机构如何守好“涉疫”数据安全?

肆虐三年的新冠疫情&#xff0c;影响着全球经济发展、社会正常运行&#xff0c;也成为网络攻击、勒索软件攻击快速增长的温床&#xff0c;“滋生”了一系列网络、数据安全问题&#xff0c;受到各界关注。最近&#xff0c;上线运行三年的 “粤康码”发布公告、官宣部分服务下线&…

C++——map和set的应用总结

目录1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用3.2 multiset3.2.1 multiset的介绍3.2.2 multiset的使用3.3 map3.3.1 map的介绍3.3.2 map的使用operator[]3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用3.5 map和set在OJ中的…

想知道车牌号码里都有什么秘密吗?

当我们看到一辆车时你会优先关注的是什么呢&#xff1f;关注它的外形还是LOGO?这个需要看你的角色定位&#xff0c;如果你是商人可能关注的方向是车的品牌&#xff0c;如果是警察可能关注的就是车牌号码。 因为&#xff0c;车牌号里的信息是很丰富的&#xff0c;可以通过查询车…

万物皆可集成资源包!低代码集成系列一网打尽

如何花最短的时间、用最少的成本解决客户的企业级应用定制问题&#xff1f; 如何满足数据库集成、Web API集成、第三方软件集成等需求&#xff0c;在如今万物皆可盘的当下&#xff0c;低代码如何用积木大玩具的方式快速构建各种应用&#xff0c;实现“万物皆可集成”&#xff…

C语言【柔性数组】

柔性数组&#x1fac5;什么是柔性数组&#x1fac5;柔性数组的使用&#x1fac5;柔性数组的优势&#x1fac5;什么是柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff0c;结构中的最后一…

ES6的迭代器与迭代协议Symbol.iterator

前言ES6新增了两个协议&#xff1a;可迭代协议&#xff1a;对象必须具有Symbol.Iterator属性&#xff0c;属性值为一个函数&#xff0c;当这个对象被迭代时&#xff0c;就会调用该函数&#xff0c;返回一个迭代器。迭代器协议&#xff1a;描述了迭代器对象的具体规则。迭代器迭…

ubuntu的文件系统结构

一. ubuntu 系统的根目录“/” Linux 系统下 “/” 就是系统的根目录&#xff0c;所有的目录是由根目录衍生出来的。 进入根目录的方法&#xff1a;终端输入" cd / " 命令。如下所示&#xff1a; 二. ubuntu 文件系统结构 /bin: 存放二进制的可执行文件。所谓…

【项目实战】接入极光推送SDK,实现从Java服务端后台推送自定义消息到Android车机端

一、需求描述 项目中需要接入极光推送SDK&#xff0c;实现从Java服务端推送消息到Android车机端&#xff0c;以下实现的功能主要是安卓端的&#xff0c;IOS端的虽然代码也兼容了&#xff0c;但是不在本次讨论范围内。以下是具体的实现过程。 二、极光推送介绍 极光推送是一款…

《Qt6开发及实例》6-4 显示SVG格式图片

目录 一、简介与设计 1.1 简介 1.2 设计 二、SvgWidget 2.1 鼠标滚轮事件 三、svgwindow 四、MainWindow 一、简介与设计 1.1 简介 1、SVG 的英文全称是 Scalable Vector Graphics&#xff0c;即可缩放的矢量图形。它是由万维网联盟&#xff08;W3C&#xff09;在 200…

什么是循环依赖,spring是如何去解决循环依赖问题的?什么是三级缓存?【spring】

文章目录什么是循环依赖&#xff1f;什么是三级缓存&#xff1f;执行流程什么是循环依赖&#xff1f; 在我们的开发中&#xff0c;会不可避免的遇到Bean之间循环依赖的&#xff0c;所谓循环依赖&#xff0c;就是两个或者两个以上的Bean互相持有对方&#xff0c;这样在程序运行…