c++类友元函数理解(图、文、代码)

news2024/10/6 18:33:01

 序:

        1、初学c++,理解阶段,一下为个人理解和案例,陆续更新

一、友元函数和普通函数区别

类的友元函数是函数,但是他可以调用类的私有变量,以下代码,Fun2是报错的,因为这个函数跟A没任何关系,但是缺想掉A的私有变量。

#include <iostream>
#include <windows.h>
using namespace std;
//先声明两个类
class A; 
class B;

//定义类 A
class A{
    private:
        int x=1;
    public:
        friend int FUN1(A a);
};
int FUN1(A a){
    return a.x;
}
int Fun2(A a){
    return a.x;//注释掉,不然会报错!!!!!!!!!!!!!!!!!
}
// 程序的主函数
int main()
{
    SetConsoleOutputCP(65001);
    A a;
    int s=FUN1(a);
    cout << s;
    return 0;
}

二、博主以为他的作用还是在多个类之间操作,前面那个案例已经说了,普通函数不能直接访问类的私有变量,现在我有一个场景,我要两个类的私有(private)变量相加,

#include <iostream>
#include <windows.h>
using namespace std;
//先声明两个类
class A; 
class B;

//定义类 A
class A{
    private:
        int x=1;
    public:
        friend int FUN1(A a,B b);
};
//定义类 B
class B{
    private:
        int x=2;
    public:
        friend int FUN1(A a,B b);
};
int FUN1(A a,B b){
    return a.x+b.x;
}

// 程序的主函数
int main()
{
    SetConsoleOutputCP(65001);
    A a;
    B b;
    int addVal=FUN1(a,b);
    cout << addVal;
    return 0;
}

 看明白了吗,他的应用场景 博主以为应该是 适用于多类之间的运算封装成函数,你总不能在main写一大堆逻辑代码吧。当然应用场景很少,如果变量都是public之类的 也是用不着 这个友元。

二、说说和类成员函数区别把

看下面的代码

#include <iostream>
#include <windows.h>
using namespace std;
//先声明两个类
class A; 
class B;

//定义类 A
class A{
    private:
        int x=1;
    public:
        friend int FUN1(A a);
        int FUN2();
};
int A::FUN2(){
    return x;
}
int FUN1(A a){
    return a.x;
}
// 程序的主函数
int main()
{
    SetConsoleOutputCP(65001);
    A a;
    cout <<FUN1(a)<<endl;
    cout <<a.FUN2()<<endl;
}

 一个调用是FUN1(a),一个是 a.FUN2()

再一个,因为友元函数内没有 this,而类成员函数内有 this所以友元函数只能是a.x,那你就得传a这个变量名,而类成员不需要传直接就是x;

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

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

相关文章

基于SSM框架流浪动物救助及领养管理系统(spring+springmvc+mybatis+jsp+jquery+layui)

一、项目简介 本项目是一套基于SSM框架流浪动物救助及领养管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&…

java错题总结(28-30页)

------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- 不考虑类加载&#xff0c; --------------------------------------------…

实验三 磁盘调度算法设计

实验三 磁盘调度算法设计 实验目的&#xff1a; 通过对磁盘调度算法的设计&#xff0c;深入理解提高磁盘访问速度的原理。 实验内容&#xff1a; 模拟实现磁盘调度算法&#xff1a;最短寻道时间优先&#xff08;SSTF&#xff09;和扫描&#xff08;SCAN&#xff09;算法。 …

数字化转型导师坚鹏:企业数字化转型培训如何高效推进评价与改进

企业数字化转型培训如何高效推进、评价与改进 ——以推动企业数字化转型战略落地为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多企业都在开展企业数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a; 不清楚如何有效推进企业数字化转型培训…

JavaScript 箭头函数

&#xff08;许多人所谓的成熟&#xff0c;不过是被习俗磨去了棱角&#xff0c;变得世故而实际了。那不是成熟&#xff0c;而是精神的早衰和个性的消亡。真正的成熟&#xff0c;应当是独特个性的形成&#xff0c;真实自我的发现&#xff0c;精神上的结果和丰收。——周国平&…

Vue|内置指令

Vue的内置指令是带有v-前缀的特殊属性&#xff0c;它的作用是当表达式的值改变时将其一系列连带影响&#xff0c;响应地作用于DOM元素。 推荐专栏&#xff1a;微信小程序实战开发专栏 内置指令v-text指令v-html指令v-cloak指令v-once指令v-pre指令 内置指令 开始前的准备&#…

虹科方案 | CEMEX 使用HK-Edgility 智能边缘计算平台简化其企业 WAN 管理和运营

一、应对价值 130 亿美元的跨国企业的网络挑战 “我们选择 Edgility 是因为其卓越的管理和协调功能&#xff0c;它为我们提供了一个端到端的工具集&#xff0c;可以经济高效地部署和管理我们边缘设备的生命周期。” —— Fernando Garcia -Villaraco Casero, CEMEX 全球IT 战略…

玩家必看!这三款简单好玩的免费小游戏平台!

在这个飞速发展和高度竞争的时代&#xff0c;人们的日程表已经被各种事情排满。时间的紧迫使得我们不可能一刻都停歇下来&#xff0c;正因为如此&#xff0c;我们才需要适当地放慢自己的步伐&#xff0c;寻找些许休闲娱乐的机会来放松自己。 现如今&#xff0c;越来越多的小游…

VSAN 6.7虚拟机精简置备盘空间不回收

原创作者&#xff1a;运维工程师 谢晋 VSAN 6.7虚拟机精简置备盘空间不回收 前提 前提 客户VSAN6.7环境&#xff0c;做了Horzion7.4&#xff0c;近期发现虚拟机存储空间越来越大&#xff0c;远远超过了已分配的磁盘空间大小&#xff0c;发现是数据写入系统内即使删除了数据…

25个著名的WordPress网站案例

想创建免费网站吗&#xff1f;从易服客建站平台开始 500M免费空间&#xff0c;可升级为20GB电子商务网站 创建免费网站 WordPress 内容管理系统为全球35%的网站提供支持。鉴于目前有 17 亿个站点&#xff0c;并且还在增加&#xff0c;您可以算出每秒向网站访问者提供内容的W…

【C++】map和set的介绍+使用

前言&#xff1a; 我们前面一起学习了二叉搜索树&#xff0c;这便是为了引入本章我们所学的map和set容器。map和set的底层实现就和二叉搜索树有关... 目录 &#xff08;一&#xff09;键值对的引入 &#xff08;1&#xff09;关联式容器 &#xff08;2&#xff09;键值对 …

NVIDIA GPU Driver, CUDA 和 PyTorch的版本关系

我们在进行深度学习环境配置的时候&#xff0c;会遇到各种各样的问题。有各种各样的驱动、包需要安装。不同驱动和包之间的还存在版本适配问题&#xff0c;刚入手的同学会一脸懵逼。配置环境成了入门的第一道门槛。我现在总结了NVIDIA 显卡 Anaconda资源库 PyTorch深度学习框…

Packet Tracer - 配置扩展 ACL - 场景 2

Packet Tracer - 配置扩展 ACL - 场景 2 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.101.117.49 255.255.255.248 不适用 G0/1 10.101.117.33 255.255.255.240 不适用 G0/2 10.101.117.1 255.255.255.224 不适用 PCA NIC 10.101…

No primary or single public constructor found for interface java.util.List

我的爆错原因是途中ids忘记标注注解PathVariable了&#xff0c;因为要传入一系列的整数的列表对象到路径/emps/deleteEmps/{ids}中&#xff0c;所以我这里就是加上注解PathVariable就OK了。

TAPD使用规范

目录 https://www.bilibili.com/?spm_id_from333.788.0.0我该如何理解这段网址&#xff1f; ?spm_id_from333.788.0.0&#xff1a;表示查询字符串&#xff0c;用于向服务器传递额外的参数信息。在这个例子中&#xff0c;该查询字符串可能用于追踪网站访问来源或统计数据分析…

windows权限维持之计划任务

schtasks常用参数: /Create 创建新计划任务。 /Delete 删除计划任务。 /Query 显示所有计划任务。 /Change 更改计划任务属性。 /Run 按需运行计划任务。 /End 中止当前正在运行的计划任务。 …

会声会影2023旗舰版升级更新及新增功能讲解

会声会影2023新版增加了众多新功能&#xff0c;在海外同样引起了很多关注。每年会声会影更新他都会制作一条&#xff0c;今年的你也不容错过&#xff0c;相信你看完对2023版会声会影将更有兴趣升级~ 建议2022版之前的老朋友&#xff0c;一定要升级2023版&#xff0c;在程序的性…

Linux的字符集及编码

Linux 字符集设置 1、查询 (1) 查看当前服务器字符集: # locale (2) 查看服务器支持的字符集: # locale -a 2、修改linux系统字符集的方式有如下两种&#xff1a; (1) 直接设置变量的方式修改&#xff0c;命令如下两条命令&#xff1a; [root~]# LANG"xxx" 或者…

人脉社交社群运营系统源码

人脉社交社群运营需要注意以下几个方面&#xff1a; 社群定位&#xff1a;要明确社群的目标人群、服务内容和特点&#xff0c;以便吸引到符合社群需求的用户。 内容策划&#xff1a;需要提供丰富、有趣、有价值的内容&#xff0c;如文章、图片、视频等&#xff0c;以增…

鸿蒙Hi3861学习八-Huawei LiteOS(事件标记)

一、简介 事件是一种实现任务间通信的机制&#xff0c;可用于实现任务间的同步。但事件通信只能是事件类型的通信&#xff0c;无数据传输。一个任务可以等待多个事件的发生&#xff1a;可以是任意一个事件发生时唤醒任务进行事件处理&#xff1b;也可以是几个事件都发生后才唤醒…