C++核心编程---友元

news2024/11/21 2:33:59

目录

友元

友元的关键字  friend

友元的三种实现方式

1. 全局函数做友元

2. 类做友元

3. 成员函数做友元


友元

生活中你的家有客厅(Public),有你的卧室(Private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

但是呢,你也可以允许你的好闺蜜好基友进去。

在程序中,有些私有属性 也想让一些特殊的类或者类外特殊的函数访问,需要友元。

友元的目的是让一个函数或者类访问另一个类中的私有成员

类的主要特点是封装性,即类的私有成员只能被它自己的成员函数访问,类外的函数无法访问类的私有成员。有时候,外部函数需要直接访问类的私有数据成员,以便提高效率,这时就可以把这个外部函数定义为该类的友元函数。这种在某个类定义中用friend声明一个外部函数(也许是其他类的成员函数)的方法,就好像宣布了一种“亲友”关系,这个外部虽然不是该类的成员函数,却可以访问该类的所有成员,无论是公有成员还是私有成员。

如果没有友元机制,则只能将类的所有成员都定义为公有的,任何函数都可以无约束地访问它,但是这样做就破坏了类的封装性。而友元机制可以在不破坏类的封装性的前提下,提高类成员访问的灵活性。

友元函数常常是一个类的一个成员函数,这样通过友元函数可以使一个类对象直接访问另一个类对象的私有成员。这种成员函数不仅可以访问自己所在本类对象中的私有成员,还可以访问friend声明所在类的对象中的私有与公有成员。

当友元函数是另一个类的成员函数时,还应该在另一个类中声明它的友元关系。声明语句的格式为:

friend<函数类型><类名>::<函数名>(<形参表>);

说明:

(1)友元函数虽然可以访问对象的私有成员,但它毕竟不是类的成员函数,因此,在类的外部定义友元函数时,不必像成员函数那样在函数名之前加上“类名::”。

(2)友元函数一般带有一个该类的入口参数。因为友元函数不是类的成员,所以它不能直接引用对象成员的名字,也不能通过this指针引用对象成员。它必须通过作为入口参数传递过来的对象名或对象指针来引用该对象的成员。

友元的关键字  friend

友元的三种实现方式

  1. 全局函数做友元

  2.  类做友元

  3.  成员函数做友元

1. 全局函数做友元

示例:

#include<iostream>

#include<string>

using namespace std;

 

// 房屋的类

class building{

    // 设置 good 函数为友元 可以访问私有属性

    friend void good(building &Building);

public:

    building()

    {

        m_sittingroom = "客厅";

        m_bedroom = "卧室";

    }

    string m_sittingroom;

 

private:

    string m_bedroom;

};

 

// 全局函数

void good(building &Building)

{

    cout<<"全局函数访问:"<<Building.m_sittingroom<<endl;

    cout<<"全局函数访问:"<<Building.m_bedroom<<endl;

}

int main()

{

    building Building;

    good(Building);

    return 0;

}

运行结果:

 

2. 类做友元

示例:

#include<iostream>

#include<string>

using namespace std;

 

class building;

 

class good_g{

public:

    good_g();

    void visit(); // 参观访问Building中的属性

private:

    building *Building;

};

 

 

// 房屋的类

class building{

    // 设置good_g为本类的友元

    friend class good_g;

 

public:

    building();

    string m_sittingroom;

 

private:

    string m_bedroom;

};

 

// 类外写成员函数

building::building()

{

    this->m_sittingroom = "客厅";

    this->m_bedroom = "卧室";

}

good_g::good_g()

{

    // 创建一个建筑物对象

    Building = new building; // 在堆区创建一个对象

}

void good_g::visit()

{

    cout<<"good_g类正在访问:"<<Building->m_sittingroom<<endl;
    
    cout<<"good_g类正在访问:"<<Building->m_bedroom<<endl;

}

void test01()

{

    good_g gg;

    gg.visit();

}

int main()

{

 

    test01();

    return 0;

}

运行结果:

 

3. 成员函数做友元

示例:

#include<iostream>

#include<string>

using namespace std;



class building;



class good_g {

public:

    good_g();

    void visit(); // 参观访问Building中的属性

    void visit2(); // 访问不到building中的私有成员

private:

    building* Building;

};





// 房屋的类

class building {

    // good_g 类下的函数作为本类的友元,要加作用域才可以访问私有内容

    friend void good_g::visit();



public:

    building();



public:

    string m_sittingroom;



private:

    string m_bedroom;

};



// 类外写成员函数

building::building()

{

    this->m_sittingroom = "客厅";

    this->m_bedroom = "卧室";

}

good_g::good_g()

{

    // 创建一个建筑物对象

    Building = new building; // 在堆区创建一个对象

}

void good_g::visit()

{

    cout << "visit 正在访问:" << Building->m_sittingroom << endl;

    cout << "visit 正在访问:" << Building->m_bedroom << endl;

}

void good_g::visit2()

{

    cout << "visit2 正在访问:" << Building->m_sittingroom << endl;

    //cout<<"visit2 正在访问:"<<Building->m_bedroom<<endl;

    // visi2 访问不到buiding类中的私有成员,没有设置友元

}

void test01()

{

    good_g gg;

    gg.visit();

    gg.visit2();

}

int main()

{



    test01();

    return 0;

}

运行结果:

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

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

相关文章

通过率90%的软件测试简历长什么样?

作为软件测试的从业者&#xff0c;面试或者被面试都是常有的事。 可是不管怎样&#xff0c;和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等。 面试者希望通过简历把自己最好的一面体现给面试官&#xff0c;所以在这场博弈中&#xff0…

抖音小店怎么做?五步教你做好抖店,新手快来看!

我是电商珠珠 新手在做抖音小店的时候&#xff0c;往往在入驻完成之后&#xff0c;就不知道后续应该怎么操作了。 我将抖店的运营分为了五个步骤&#xff0c;可以供大家参考。 一、类目 开店之前选择好的类目&#xff0c;后续如果想要更改的话可以随时更改。 不过需要下架…

vue中watch实现翻译案例

翻译案例需要向在线接口发起一个Ajax请求&#xff0c;所以需要引入axios库。当输入一个单词或者文字时自动发起翻译请求。所以可以使用watch监听器来监听属性是否变更&#xff0c;当发生变化即发起翻译请求。 // 该方法会在数据变化时调用执行 // newValue新值, oldValue老值&…

linux环境mysql安装配置踩坑

背景&#xff1a; 最近公司项目希望改造工作流ACTIVITI5.x的源码框架支持大数据量&#xff08;历史表单表数据达到10亿&#xff09;&#xff0c; 方案暂定为 1.使用动态数据源 2.将工作流归档历史数据数据保存到一个库中这里定义为读库&#xff0c; 3.在办办件的数据单独一个库…

人工智能基础_机器学习012_手写梯度下降代码演示_手动写代码完成梯度下降_并实现梯度下降可视化---人工智能工作笔记0052

可以看到上面我们那个公式,现在我们用梯度下降实现一下,比如我们有一堆数据,但是没有方程的情况下,我们来看一下如果计算,对应的w值也就是seta值对吧,没有方程我们可以使用梯度下降 这里首先我们可以设置一个0.0001.我们知道梯度下降的公式, 梯度下降刚开始的时候,下降会快,然…

基于FPGA的图像差分运算及目标提取实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2022/07/28 01:51:…

k8spod

pod基本概念 (几种容器) pod 是k8s最小的创建和运行单元 一个pod包含几个容器&#xff0c;1个根容器/父容器/基础容器&#xff0c;一个或者多个应用容器/业务容器&#xff0c;pause容器 pod里面容器共享 network UTS IPC命令空间 k8s 创建的Pod 分为两种&#xff1a; 自主…

洞见UI自动化测试

随着软件行业的不断发展&#xff0c;建立一个完善的自动化测试体系变得至关重要。自动化测试包括三个方面&#xff1a;UI前端界面&#xff0c;Service服务契约和Unit底层单元如下图&#xff1a; 越是底层的测试&#xff0c;运行速度越快&#xff0c;时间开销越少&#xff0c;金…

Yakit工具篇:WebFuzzer模块之重放和爆破

简介 Yakit的Web Fuzzer模块支持用户自定义HTTP原文发送请求。为了让用户使用简单&#xff0c;符合直觉&#xff0c;只需要关心数据相关信息&#xff0c;Yakit后端(yaklang)做了很多工作。 首先我们先来学习重放请求的操作&#xff0c;在日常工作中可以使用 Web Fuzzer进行请…

九、W5100S/W5500+RP2040树莓派Pico<SNTP 获取网络时间>

文章目录 1 前言2 协议简介2.1 什么是SNTP2.2 SNTP的优点2.3 SNTP原理2.4 应用场景 3 WIZnet以太网芯片4 SNTP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 随着科技的不断进步和应用需求的不断变…

深度学习之基于Yolov8的汽车车流量统计系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、汽车车流量统计系统四. 总结 一项目简介 基于YOLOv8的汽车车流量统计系统是一种利用深度学习技术进行车辆检测和统计的系统。YOLOv8是一种目标…

解析开关电源测试项目:电源下降时间及其测试方法、测试规范、注意事项

开关电源下降时间是指电压从90%下降到10%的时间。下降时间是开关电源的重要特性参数&#xff0c;对于电路稳定以及信号传输的准确性至关重要&#xff0c;同时也对电路设计和调试具有重要意义。 电源下降时间测试方法和注意事项 测试目的&#xff1a;测试S.M.P.S. POWER ON时&am…

java spring boot 注解、接口和问题解决方法(持续更新)

注解 RestController 是SpringMVC框架中的一个注解&#xff0c;它结合了Controller和ResponseBody两个注解的功能&#xff0c;用于标记一个类或者方法&#xff0c;表示该类或方法用于处理HTTP请求&#xff0c;并将响应的结果直接返回给客户端&#xff0c;而不需要进行视图渲染…

IA3源码分析

IA3源码分析 PEFT 开源包中的模型代码实现 class IA3Model(BaseTuner):"""Example:py>>> from transformers import AutoModelForSeq2SeqLM, ia3Config>>> from peft import IA3Model, IA3Config>>> config IA3Config(... pe…

实力验证 | 求臻医学满分通过CAP及NCCL组织的国内外三项室间质评

近日&#xff0c;求臻医学以满分的优异成绩通过了由美国病理学家协会&#xff08;College of American Pathologists&#xff0c;CAP&#xff09;组织的NGS−A 2023&#xff1a;Next−Generation Sequencing (NGS) – Germline、NEO-B 2023 Neoplastic Cellularity能力验证项目…

User-Agent防爬虫与应对策略

引题 最近在看爬虫&#xff0c;也准备学习一下防爬的策略&#xff0c;世上莫大之事就是&#xff0c;我可以爬别人网站&#xff0c;别人不许爬我网站。 正文 什么是User-Agent User-Agent是一个HTTP请求头的一部分&#xff0c;它向Web服务器提供关于客户端&#xff08;通常是…

使用 RBAC 鉴权实战

使用 RBAC 鉴权实战 官方文档 创建名称 deployment-clusterrole 的 ClusterRole&#xff0c;该⻆⾊具备创建 Deployment、Statefulset、Daemonset 的权限&#xff0c;在命名空间 rbac-test 中创建名称为 cicd-token 的 ServiceAccount&#xff0c;绑定 ClusterRole 到 Service…

Linux学习第28天:Platform设备驱动开发(二): 专注与分散

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、硬件原理图分析 四、驱动开发 1、platform设备与驱动程序开发 53 /* 54 * 设备资源信息&#xff0c;也就是 LED0 所使用的所有寄存器 55 */ 56 static str…

揭秘!产品经理提升效率的秘密武器:10款AI生成PPT工具

AI的爆炸式增长表现令人惊艳&#xff0c;现有的各类AI工具正在重塑各行各业&#xff0c;不同程度地提高人们的工作效率&#xff0c;并有望创造新的职业机会。但是&#xff0c;面对市面上数量众多的AI工具&#xff0c;且每周都会蹦出新的产品&#xff0c;即便是以好奇心富称的产…

巴黎奥运会将基于阿里云实现云上转播

10月31日&#xff0c;2023杭州云栖大会&#xff0c;奥林匹克广播服务公司与奥林匹克频道服务公司首席技术官索蒂里斯萨拉穆里斯&#xff08;Sotiris SALAMOURIS&#xff09;表示&#xff0c;过去5年阿里云作为奥运会转播的基础设施&#xff0c;让奥运故事触达了更多全球观众。 …