当前位置: 首页 > news >正文

C++中的友元及运算符重载

友元

  • 意义
    • 程序中,有些私有属性也想让类外特殊的一些函数或者类进行访问,就要用到友元技术
  • 关键字
    • friend
  • 友元的三种实现
    • 全局函数做友元
    class Room{friend void test(Person &p);//friend class test;public:string phone_number;private:string bedroom;
    }void test(Person &p){cout << p->bedroom << endl;}
    
    • 类做友元
      • friend class test;
    • 成员函数做友元
      • friend void GoodGay::visit();
      • GoodGay类下的visit成员函数作为本类的好朋友可以访问私有成员

运算符重载

  • 概念
    • 对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型
    • 主要是重载函数的函数名就是operator,这是编译器起好的
  • 加号
    • 成员函数重载
    • 调用的本质Person p3 = p1.operator+(p2);
      class Person{public:Person operator+(Person &p){Person temp;temp.m_A = this->m_A + p.m_A;temp.m_B = this->m_B + p.m_Areturn temp;}}
    
    • 全局函数重载
    • 调用的本质Person p3 = operator+(p1, p2);
      Person operator+(Person &p1, Person &p2){Person temp;temp.m_A = p1.m_A + p2.m_A;temp.m_B = p1.m_B + p2.m_B;return temp;}
    
    • 函数重载依然适用于符号重载
  • 左移—输出—可以输出自定义数据类型—需要配合友元
    • 成员函数—不可行—因为无法实现对象在右边这种情况
      • p.operator<<(cout)简化为p << cout
    • 只能利用全局函数重载
      • operator<<(cout, p) 简化 cout << p
      ostream& operator<<(ostream& cout, Person &p){cout << "m_A = " << p.m_A;return cout;}//cout其实也是一个对象,为了满足链式编程,故而不可以重新创建后返回因此采用引用
    
    • 问题—如果是私有属性,这种全局函数无法访问怎么办—友元函数
  • 递增/递减运算符重载—存在前置递增和后置递增
    • 前置递增和后置递增的区分—采用占位参数
    • 前置递增返回的是引用,后置递增返回的是数值
      • 因为后置递增返回的是临时对象
      class Num{friend ostream& operator<<(ostream& cout, Num n);private:int n_Num;public:Num(int a): n_Num(a) {return ;}Num& operator++(void){n_Num++;return *this;}Num operator++(int){Num temp = (n_Num);n_Num++;return temp;}   };ostream& operator<<(ostream& cout, Num& n){cout << n.n_Num << endl;return cout;}int main(){Num n(1);cout << n++ <<endl;cout << n << endl;cout << ++n << endl;return 0;}
    
  • 赋值运算符
    • 赋值运算=其实也是默认就有的—属性值拷贝
    • 编译器提供的赋值运算符的操作是一个浅拷贝的操作,因此在涉及到内存问题时候需要进行深拷贝,故而需要进行重载
    • = 有连续赋值行,因此,涉及到链式编程
      class Age{friend ostream& operator<<(ostream& cout, Age& n);private:int* m_age;public:Age(int age){m_age = new int(age);}Age(const Age& age){if(m_age != NULL){delete m_age;m_age = NULL;}m_age = new int(*age.m_age);}Age& operator=(Age &p){if(m_age != NULL){delete m_age;m_age = NULL;}m_age = new int(*p.m_age);return *this;}~Age(){if(m_age != NULL){delete m_age;m_age = NULL;}}};ostream& operator<<(ostream& cout, Age& n){cout << *n.m_age << endl;return cout;}int main(){Age a(10);Age b(20);Age c(30);cout << a << endl;cout << b << endl;cout << c << endl;a = b = c;cout << a << endl;return 0;}
    
  • 关系运算符
    • 意义
      • 让两个对象可以进行比较
      class Person{public:int m_age;string m_name;Person(string m_name, int m_age){this->m_name = m_name;this->m_age = m_age;}bool operator==(Person& p){if(this->m_age == p.m_age && this->m_name == p.m_name){return true;}return false;}bool operator!=(Person& p){if(this->m_age != p.m_age || this->m_name == p.m_name){return true;}return false;}};
    
  • 函数调用运算
    • ()也可以重载
    • 由于重载后使用的方式非常像函数的调用,因此称为访函数
    • 访函数没有固定写法,非常灵活
      class Myprintf{public:void operator()(string test){cout << test << endl;}}Myprintf printf;printf("hello cpp");
    
  • 匿名函数
    • 类型()
    • Myprintf()(“hello cpp”);

相关文章:

C++中的友元及运算符重载

友元 意义 程序中&#xff0c;有些私有属性也想让类外特殊的一些函数或者类进行访问&#xff0c;就要用到友元技术 关键字 friend 友元的三种实现 全局函数做友元 class Room{friend void test(Person &p);//friend class test;public:string phone_number;private:string…...

五、运行时数据区内部结构、JVM中的线程

内存是非常重要的系统资源&#xff0c;是硬盘和cpu的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程种内存申请、分配‘、管理的策略&#xff0c;保证了JVM的高效稳定运行&#xff0c;不同的JVM对于内存的划分方式和管理机制…...

Codeforces Round #848 (Div. 2)A-C

传送门 目录 A. Flip Flop Sum 代码&#xff1a; B. The Forbidden Permutation 代码&#xff1a; C. Flexible String 代码&#xff1a; A. Flip Flop Sum 题意&#xff1a;给你一个长度为n的数组&#xff08;数组元素只为1或者-1&#xff09;&#xff0c;你要且只能进行…...

机器学习笔记之近似推断(一)从深度学习角度认识推断

机器学习笔记之近似推断——从深度学习角度认识推断引言推断——基本介绍精确推断难的原因虽然能够表示&#xff0c;但计算代价太大无法直接表示引言 本节是一篇关于推断总结的博客&#xff0c;侧重点在于深度学习模型中的推断任务。 推断——基本介绍 推断(Inference\text{…...

指针的进阶

一、字符指针 int main() {char ch w;char* pc &ch;//pc就是字符指针//const char *p "abcdef";//这里其实是把字符串"abcdef"的首地址放入了指针p中//*p w;//这是错误的无法修改值&#xff08;可以看到这里绿色波浪线警告&#xff09;char arr[] …...

一元二次方程方程的类

1 问题设计一个一元二次方程的类&#xff0c;其中包括能够反映一元二次方程的属性与操作行为&#xff0c;然后再设计一个测试类&#xff0c;检测类的使用情况。2 方法使用package语句将方程的属性即计算跟的方法封装在一个有包名的类中&#xff0c;包名为tom.jiafei&#xff0c…...

Ask林曦|来回答,30个你关心的日常问题(二)

在林曦老师的线上书法直播课上&#xff0c;上课前后的聊天时间里&#xff0c;时常有同学向林曦老师提问&#xff0c;这些问题涵盖了日常生活的诸多方面&#xff0c;从身体的保养&#xff0c;到快乐的法门&#xff0c;皆是大家感兴趣的&#xff0c;也都共同关切的。   暄桐教室…...

哪款电容笔适合开学季?电容笔和Apple Pencil的区别

其实&#xff0c;市场上一般的电容笔和Apple Pencil的最大差别&#xff0c;就在于Apple Pencil与普通电容笔两者的重量和压感。然而&#xff0c;由于苹果电容笔价格过高&#xff0c;目前电容笔的市场份额逐渐转向平替电容笔&#xff0c;平替电容笔其性能也逐渐得到改善。下面&a…...

Qt之Qprocess

QProcess 可用于完成启动外部程序&#xff0c;并与之交互通信。 一、启动外部程序的两种方式   1&#xff09;一体式&#xff1a;void QProcess::start(const QString & program,const QStringList &arguments,OpenMode mode ReadWrite)     外部程序启动后&…...

为什么不愿意专升本 学历有什么用

专升本包括两种形式普通专升本和成人专升本。普通专升本毕业是全日制学历&#xff0c;考试仅有一次&#xff0c;错过不能补考所以考生不愿意选择&#xff0c;成人专升本毕业是非全日制学历&#xff0c;学历被国家承认&#xff0c;和普通高校毕业证有相同的使用效力。为何考生不…...

构造函数的使用大全

概述 在C中创建一个对象时&#xff0c;通常需要做一些数据初始化的工作&#xff0c;因此便提供了一个特殊的成员函数 —— 构造函数。一般情况下&#xff0c;并不需要程序员主动调用构造函数&#xff0c;而是在创建对象时&#xff0c;由系统自动调用。构造函数可以由程序员定义…...

ASP.NET Core MVC 项目 IOC容器

目录 一&#xff1a;什么是IOC容器 二&#xff1a;简单理解内置Ioc容器 三&#xff1a;依赖注入内置Ioc容器 四&#xff1a;生命周期 五&#xff1a;多种注册方式 一&#xff1a;什么是IOC容器 IOC容器是Inversion Of Control的缩写&#xff0c;翻译的意思就是控制反转。 …...

ARM工控机/网关- 钡铼技术

一、NXP处理器ARM控制器的介绍 NXP半导体是汽车、穿戴、消费电子等领域中智能机器解决方案的领先供应商。其产品线庞大&#xff0c;包括处理器、微控制器、快速设计平台、ARM控制器等。在物联网控制、汽车电子、安全应用等领域&#xff0c;NXP处理器ARM控制器已成为半导体行业的…...

为什么都在喊数据可视化?它究竟怎么做?

在数字化转型的浪潮中&#xff0c;不论是传统行业&#xff0c;还是新兴行业总会提到“数据可视化”这个词。那数据可视化到底是什么&#xff1f;为什么会受到那么多人追捧&#xff1f;又该怎么才能做到数据可视化呢&#xff1f; 一、数据可视化是什么&#xff1f; 首先“可视…...

nodejs+vue停车场停车位短租系统vscode

目 录前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后&#xff0c;cd到项目目录执行npm install后生成的文件夹&#xff0c;下载了项目需要的依赖项。 2、…...

物理真机上LUKS结合TPM的测试 —— 使用随机数密钥

1. 创建磁盘空间 命令如下&#xff1a; dd if/dev/zero ofenc.disk bs1M count50 实际命令及结果如下&#xff1a; $ dd if/dev/zero ofenc.disk bs1M count50 输入了 500 块记录 输出了 500 块记录 52428800 字节 (52 MB, 50 MiB) 已复制&#xff0c;0.0587495 s&#xff…...

Linux USB 开发指南

文章目录Linux USB 开发指南1 前言1.1 文档简介1.2 目标读者1.3 适用范围2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 模块配置介绍2.3.1 Device Tree 配置说明2.3.2 board.dts 配置说明2.3.3 kernel menuconfig 配置说明2.4 源码结构介绍2.5 驱动框架介绍2.6 Gadget 配置2…...

FreeRTOS入门(03):队列、信号量、互斥量

文章目录目的队列&#xff08;queue&#xff09;信号量&#xff08;semaphore&#xff09;互斥量&#xff08;mutex&#xff09;互斥量递归互斥量总结目的 FreeRTOS提供给用户最核心的功能是任务&#xff08;Task&#xff09;&#xff0c;实际项目中通常会有多个任务&#xff…...

Biome-BGC在模拟过程中,如何使用Linux、Python等,完成前处理和后处理工作???

在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天的初级生产力(GPP)&#xff0c;将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库&#xff1b;对于水份输运过程…...

【unittest学习】unittest框架主要功能

1.认识unittest在 Python 中有诸多单元测试框架&#xff0c;如 doctest、unittest、pytest、nose 等&#xff0c;Python 2.1 及其以后的版本已经将 unittest 作为一个标准模块放入 Python 开发包中。2.认识单元测试不用单元测试框架能写单元测试吗&#xff1f;答案是肯定的。单…...

京东测开岗3+1面经+经验分享,拿到offer,月薪34k....

现在&#xff0c;招聘黄金时间已经来临&#xff0c;在网上看了很多大佬的面经&#xff0c;也加了很多交流群&#xff0c;受到了很多朋友的提点&#xff0c;今天终于轮到我来分享面经啦&#xff0c;之前面试了几家公司&#xff0c;最后拿到了京东测试岗的 offer&#xff0c;这里…...

后端接收格式为x-www-form-urlencoded的数据

1.x-www-form-urlencoded是什么&#xff1f; x-www-form-urlencoded纸面翻译即所谓url格式的编码&#xff0c;是post的默认Content-Type&#xff0c;其实就是一种编码格式&#xff0c;类似json也是一种编码传输格式。form表单中使用 form的enctype属性为编码方式&#xff0…...

LeetCode 707. 设计链表

LeetCode 707. 设计链表 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性&#xff1a;valvalval 和 nextnextnext。valvalval 是当前节点的值&#xff0c;nextnextnext 是指向下…...

HTTP的主要作用是什么

1、客户与服务器建立连接&#xff1b; 2、客户向服务器提出请求&#xff1b; 3、服务器接受请求&#xff0c;并根据请求返回相应的文件作为应答&#xff1b; 4、客户与服务器关闭连接。 HTTP的性质&#xff1a; 1、HTTP是一种无状态协议&#xff0c;即服务器不保留与客户交…...

SpringBoot系列-- @Enable 模块驱动

Enable 模块驱动 Enable 模块驱动是以 Enable 为前缀的注解驱动编程模型。所谓 “模块” 是指具备相同领域的功能组件集合&#xff0c;组合所形成一个独立的单元。比如 WebMVC 模块、AspectJ 代理模块、Caching &#xff08;缓存&#xff09;模块、JMX &#xff08;Java 管理扩…...

PHP程序员适合创业吗?

创业是一件自然而然的事&#xff0c;不需要人为选择。 只要你是一个努力能干主动的人&#xff0c;当你在一个行业深耕5年之后&#xff0c;就会发现人生发展的下一步就是创业。当然如果行业合适的话。 什么叫行业合适呢&#xff1f; 就是创业的成本并不那么高&#xff0c;不需…...

2023年CDGA考试-第12章-元数据(含答案)

2023年CDGA考试-第12章-元数据(含答案) 单选题 1.元数据架构的类型主要有四种下列哪项不属于分布式元数据架构的优点? A.减少了批处理 B.元数据的质量完全取决于源系统 C.最大程度的减少了实施和维护所需的工作量 D.元数据总是尽可能保持最新且有效 答案 B 2.元数据管理是…...

数据结构之顺序表篇

一、顺序表概念 二、顺序表各类接口实现 *顺序表初始化 **顺序表销毁 ***顺序表插入操作 ****顺序表删除操作 *****顺序表查找操作 ******顺序表实现打印操作 三、顺序表整体实现源码 *SeqList.h **SeqList.c ***test.c 一、顺序表概念 讲顺序表之前先引入线性表概念&#xff…...

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”

近日&#xff0c;Zebec Protocol生态通证ZBC迎来了大涨&#xff0c;据悉该通证月内最高涨幅接近了100%&#xff0c;为一众投资者、社区用户、Zepoch节点等带来了可观的回报&#xff0c;并为生态发展注入了十足的信心。我们看到&#xff0c;Zebec Protocol生态在近期宣布了“销毁…...

人工智能练习题:激活函数需要满足的条件、提高CNN的泛化能力、CNN输出特征图大小计算

文章目录1.激活函数需要满足的条件2.提高CNN泛化能力的方法3.CNN输出特征图大小计算第一次用ChatGPT&#xff0c;不得不说在处理大学生作业上&#xff0c;ChatGPT比国内的作业软件好用多了&#xff08;感叹&#xff09;。 1.激活函数需要满足的条件 通常情况下&#xff0c;激活…...