C++学习笔记(十四)

一、运算符重载

运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

1.1 加号运算符重载

作用:实现两个自定义数据类型相加的运算
 

#include <iostream>using namespace std;class Person
{
public:// 1. 成员函数重载+号/*Person operator+(Person& p){Person temp;temp.m_a = this->m_a + p.m_a;temp.m_b = this->m_b + p.m_b;return temp;}*/int m_a;int m_b;
};// 2. 全局函数重载+号
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;
}// 运算符重载也可以发生函数重载
Person operator+(Person& p1, int num)
{Person  temp;temp.m_a = p1.m_a + num;temp.m_b = p1.m_b + num;return temp;
}void test()
{Person p1;p1.m_a = 10;p1.m_b = 20;Person p2;p2.m_a = 5;p2.m_b = 1;// 成员函数重载Person p3;// p3 = p1.operater+(p2);p3 = p1 + p2;cout << "p3.m_a = " << p3.m_a << endl;cout << "p3.m_b = " << p3.m_b << endl;// 全局函数重载Person p4;// p3 = operator+(p1,p2);p4 = p1 + p2;cout << "p4.m_a = " << p4.m_a << endl;cout << "p4.m_b = " << p4.m_b << endl;// 运算符重载也可以发生函数重载Person p5;p5 = p1 + 100;cout << "p5.m_a = " << p5.m_a << endl;cout << "p5.m_b = " << p5.m_b << endl;
}int main(int argc, char* argv[])
{test();return 0;
}

总结1:对于内置的数据类型的表达式的运算符是不可能改变的

总结2:不要滥用运算符重载

1.2 左移运算符重载

作用:可以输出自定义数据类型

#include <iostream>using namespace std;class Person
{friend ostream& operator<<(ostream& cout, Person& p);// 利用成员函数重载左移运算符 p.operator<<(p1) === p << p1// p.operator<<(cout) === p << cout// 综上所述一般不会利用成员函数重载<<运算符,因为无法实现cout在左侧
public:void setA(int a){m_a = a;}void setB(int b){m_b = b;}
private:int m_a;int m_b;
};ostream& operator<<(ostream& cout, Person& p)
{cout << "m_a = " << p.m_a << endl;cout << "m_b = " << p.m_b;return cout;
}int main(int argc,char* argv[])
{Person p;p.setA(10);p.setB(13);cout << p << endl;return 0;
}

总结:重载左移运算符配合友元可以实现输出自定义数据类型

1.3 递增运算符重载

作用:通过重载递增运算符,实现自己的整型数据

#include <iostream>using namespace std;class MyInteger
{friend ostream& operator<<(ostream& cout, MyInteger myint);
public:MyInteger(){m_num = 0;}// 重置前置++运算符 返回应用是为了一直对一个数据进行递增操作MyInteger& operator++(){// 先++m_num++;// 再返回return *this;}// 重置后置++运算符 int代表占位参数,可以用于区分前置和后置递增MyInteger operator++(int){// 先返回数据,再递增// 如果先return返回后续递增不执行// 转变成先记录数据,再递增,最后返回记录的数据MyInteger temp = *this;m_num++;return temp;}private:int m_num;
};// 重载 << 运算符
ostream& operator<<(ostream& cout, MyInteger myint)
{cout << myint.m_num;return cout;
}void test01()
{MyInteger myint;cout << ++(++myint) << endl;cout << myint << endl;
}void test02()
{MyInteger myint;cout << (myint++)++ << endl;cout << myint << endl;
}int main(int argc, char* argv[])
{test01();test02();return 0;
}

总结:前置递增返回的是引用,后置递增返回的是值

1.4 赋值运算符重载

C++编译器至少给一个类添加4个函数

1. 默认构造函数(无参,函数体为空)

2. 默认析构函数(无参,函数体为空)

3. 默认拷贝构造函数,对属性进行值拷贝

4. 赋值运算符 operator=,对属性进行值拷贝

如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题

#include <iostream>using namespace std;class Person
{
public:Person(int age){m_age = new int(age);}int* m_age;~Person(){if (m_age != NULL){delete m_age;m_age = NULL;}}// 利用深拷贝解决浅拷贝带来的问题Person& operator=(Person& p){// 编译器提供的是浅拷贝// m_age = p.m_age;// 应该先判断是否有属性在堆区,如果有先释放干净,然后再深拷贝if (m_age != NULL){delete m_age;m_age = NULL;}// 深拷贝m_age = new int(*p.m_age);return *this;}
};void test01()
{Person p1(18);cout << "p1的年龄为:" << *p1.m_age << endl;Person p2(23);cout << "p2的年龄为:" << *p2.m_age << endl;Person p3(30);cout << "p2的年龄为:" << *p2.m_age << endl;// 浅拷贝会导致堆区内存重复释放// 赋值运算符重载p3 = p2 = p1;cout << "p2的年龄为:" << *p2.m_age << endl;cout << "p2的年龄为:" << *p2.m_age << endl;cout << "p2的年龄为:" << *p2.m_age << endl;
}int main(int argc, char* argv[])
{test01();return 0;
}

1.5 关系运算符重载

作用:重载关系运算符,可以让两个自定义类型对象进行对比操作

#include <iostream>
#include <string>using namespace std;class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}bool operator==(Person& p){if (this->m_Age = p.m_Age && this->m_Name == p.m_Name){return true;}return false;}string m_Name;int m_Age;
};void test01()
{Person p1("张三", 18);Person p2("李四", 23);Person p3("李四", 23);if (p1 == p2){cout << "p1等于p2" << endl;}else{cout << "p1不等于p2" << endl;}if (p2 == p3){cout << "p2等于p3" << endl;}else{cout << "p2不等于p3" << endl;}
}int main(int argc, char* argv[])
{test01();return 0;
}

1.6 函数调用运算符重载

函数调用运算符 () 也可以重载

由于重载后使用的方式非常像函数的调用,因此称为仿函数

仿函数没有固定写法,非常灵活

#include <iostream>
#include <string>using namespace std;class MyPrint01
{
public:// 重载函数调用运算符void operator()(string text){cout << text << endl;}
};void MyPrint02(string text)
{cout << text << endl;
}class MyAdd01
{
public:// 重载函数调用运算符double operator()(double a, double b){return a + b;}
};double MyAdd02(double a, double b)
{return a + b;
}void test01()
{MyPrint01 MyPrint01;MyPrint01("hello world");MyPrint02("hello world");MyAdd01 myAdd01;double result01 = myAdd01(10, 20);double result02 = MyAdd02(10, 20);cout << "myAdd01仿函数计算的结果为:" << result01 << endl;cout << "MyAdd02函数计算的结果为:" << result02 << endl;// 匿名函数对象 类名+()为匿名对象,后面的重载的运算符cout << "匿名函数对象的计算结果为:" << MyAdd01()(10, 20) << endl;
}int main(int argc, char* argv[])
{test01();return 0;
}

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

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

相关文章

补充回答一些关于枚举类型的问题

补充回答一些关于枚举类型的问题 1.枚举类型在什么时候使用 枚举类型在以下情况下特别有用&#xff1a; 有限的离散值集合&#xff1a; 当变量的取值只有有限且离散的几个选项时&#xff0c;使用枚举类型能够提高代码的可读性。例如&#xff0c;星期几、月份、颜色等。 enum W…

讲解一手CSRF,如何防御CSRF

简介&#xff1a; CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;是一种网络安全漏洞&#xff0c;它允许攻击者通过欺骗用户在当前已登录的Web应用程序上执行未经用户授权的操作。 攻击者利用用户在目标网站上已经建立的身份认证&#xff…

Vue2面试题:说一下vue2的生命周期?

创建&#xff1a; beforecreate: 实例创建前 此阶段的data、methods、computed、watch的数据和方法不能被访问 created: 实例创建完成后 此阶段完成数据监听&#xff0c;可以使用数据、更改数据。无法与Dom进行交互&#xff0c;想要的话可以通过nextTick来访问。 挂载&#xff…

Vue 双向绑定:让数据与视图互动的魔法!(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

大数据监控

HBase 监控 {name“RegionServer”,sub“Server”,} irate(hadoop_hbase_totalrequestcount[5m]) irate(hadoop_hbase_totalrequestcount{instanceName“hacluster4”}[2m]) https://blog.csdn.net/Samooyou/article/details/129275640 https://www.tencentcloud.com/zh/doc…

【python笔记】requests模块基础总结

前言 菜某笔记总结&#xff0c;如有错误请指正。 requests用途 主要是用于发送网络请求 Requests库的主要方法和属性 rrequests.get() Response Request 对象 对象 r.cookies #打印cookie r.content #常用于图像视频等 以上内容来自2_哔哩哔哩_bilibili 发…

OpenCV中vector<Mat>数据存储问题

问题&#xff1a;定义数组Mat后&#xff0c;通过指针/取元素对Mat数组数据进行修改&#xff0c;会遇到深浅拷贝问题。 原因是&#xff1a;push_back调用的是Mat的浅拷贝函数来拷贝数据&#xff0c;数据共享。 一、浅拷贝 //注意&#xff1a;浅拷贝 - 不复制数据只创建矩阵头&…

【Netty的线程模型】

Netty的线程模型 Netty的线程模型知识拓展单Reactor单线程模型单Reactor多线程模型主从Reactor模型 Netty的线程模型 Netty通过Reactor模型基于多路复用器接收并处理用户请求的&#xff0c;多路复用IO模型参考&#xff1a; 多路复用IO模型: 操作系统的IO模型有哪些&#xff1f…

WindowChrome使用之最大化窗口拖动失败

背景&#xff1a;今天遇到一个奇怪的问题&#xff0c;窗口最大化之后&#xff0c;从屏幕外开始手指移动到窗口标题栏&#xff0c;窗口不跟随手指移动。 对WindowChrome并不是很了解&#xff0c;查了查文档&#xff0c;知道了WindowChrome是什么&#xff0c;怎么使用。 官方文档…

短剧规模达到了百亿元,短剧分销成为短剧新模式

我国短剧市场规模直接突破了三百多亿元&#xff0c;目前已经是互联网的一大创业风口&#xff01; 一、短剧特点 在当下快节奏的生活中&#xff0c;短剧具有的快节奏、剧情紧凑的特点&#xff0c;符合大众对影视的需求。目前我国的短剧题材主要是言情、总裁、赘婿等&#xff0…

Jmeter 测试 MQ 接口怎么做?跟我学秒变大神!

MQ(message queue)消息队列&#xff0c;是基础数据结构 先进先出 的一种典型数据结构。一般用来解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。 MQ 主要产品包括&#xff1a;Rabb…

基于ssm汽车养护管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本汽车养护管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

WEB渗透—PHP反序列化(一)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

npc_test.sh: line 3: $‘\r‘: command not found

[rootlocalhost ~]# bash npc_test.sh npc_test.sh: line 3: $‘\r’: command not found npc_test.sh: line 8: $‘\r’: command not found npc_test.sh: line 10: syntax error near unexpected token $‘{\r’’ pc_test.sh: line 10: 原因&#xff1a; 脚本中出现的错误…

vue3 + ts 防抖指令,节流指令,复制指令

vue3 ts 自定义指令 防抖指令&#xff0c;节流指令&#xff0c;复制指令 本文使用了 element-ui , element-plus 官网 源文件 https://admin.spicyboy.cn/#/directives/debounceDirect 新建 copy.ts 文件 &#xff08;复制指令&#xff09; import type { Directive, Di…

12.6每日一题(备战蓝桥杯程序的控制结构)

12.6每日一题&#xff08;备战蓝桥杯程序的控制结构&#xff09; 题目 1638: 【入门】判断正负数或零题目描述输入输出样例输入样例输出来源/分类 题解 1638: 【入门】判断正负数或零题目 1348: 【入门】求绝对值题目描述输入输出样例输入样例输出来源/分类 题解 1348: 【入门】…

【Qt开发流程】之2D绘图2:坐标系统

概述 Qt的坐标系统由QPainter类控制。QPainter与QPaintDevice和QPaintEngine 类一起构成了Qt的绘画系统的基础。QPainter用于执行绘图操作&#xff0c;QPaintDevice是一个二维空间的抽象&#xff0c;可以使用QPainter在其上绘制&#xff0c;QPaintEngine 提供了QPainter用于在…

C语言中的柔性数组

uint8_t data[0];代码的含义老虎开始对这个数组不太了解&#xff0c;查阅后得知这是个柔性数组。 C语言中的柔性数组&#xff08;Flexible Array Member&#xff09;是一种特殊的数组&#xff0c;它被定义在结构体的最后一个元素中&#xff0c;其大小未知&#xff0c;也就是所…

Crow:黑魔法new_rule_tagged实现模板参数的绑定

Crow添加路由的定义: #define CROW_ROUTE(app, url) app.template route<crow::black_magic::get_parameter_tag(url)>(url) Crow:黑魔法get_parameter_tag-CSDN博客 介绍了get_parameter_tag的作用 route的定义为: auto route(std::string&& rule) -> …

java--Stream流常见的中间方法和终结方法

1.Stream流常见的中间方法 中间方法指的是调用完成后会返回新的Stream流&#xff0c;可以继续使用(支持链式编程) 2.Stream流常见的终结方法 ①终结方法指的是调用完成后&#xff0c;不会返回新Stream了&#xff0c;没法继续使用流了。 ②收集Stream流&#xff1a;就是把Stre…