类和对象-C++运算符重载

#include <iostream>
#include <string>
using namespace std;class Person
{
public:Person(int age){m_Age=new int (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;}int *m_Age;
};void test01()
{Person p1(18);Person p2(20);Person p3(30);p3=p2=p1;//赋值操作cout<<"p1的年龄为: "<<*p1.m_Age<<endl;cout<<"p2的年龄为: "<<*p2.m_Age<<endl;cout<<"p3的年龄为: "<<*p3.m_Age<<endl;
}int main()
{test01();/*int a=10;int b=10;int c=10;c=b=a;//内置函数支持连等式cout<<"a= "<<a<<endl;cout<<"b= "<<b<<endl;cout<<"c= "<<c<<endl;*/system("pause");return 0;
}

师从黑马

运算符重载

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

加号运算符重载

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

#include <iostream>
#include <string>
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 test01()
{Person p1;p1.m_A = 10;p1.m_B = 10;Person p2;p2.m_A = 10;p2.m_B = 10;//成员函数重载本质调用// Person p3=p1.operator+(p2);//全局函数的本质调用//Person p3=operator+(p1,p2);//简化Person p3 = p1 + p2;//运算符重载,也可以发生函数重载Person p4=p1+100;//Person +intcout << "p3.m_A= " << p3.m_A << endl;cout << "p3.m_B= " << p3.m_B << endl;cout << "p4.m_A= " << p4.m_A << endl;cout << "p3.m_B= " << p4.m_B << endl;
}int main()
{test01();system("pause");return 0;
}

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

左移运算符重载

#include <iostream>
#include <string>
using namespace std;class Person
{friend ostream &operator<<(ostream &ut,Person &p);//利用成员函数重载 左移运算符   p.operator<<(cout)  简化版本 p<<cout//不会利用成员函数重载<<运算符,因为无法实现cout在左侧// void operator<<(cout)//{//}
public:Person(int a,int b){m_A=a;m_B=b;}private:int m_A;int m_B;
};//只能利用全局函数重载左移运算符
ostream &operator<<(ostream &ut,Person &p)//本质 operator<<(cout,p)简化cout<<P
{ut<<"m_A="<<p.m_A<<"m_B= "<<p.m_B;
}
void test01()
{Person p(10,10);cout<<p<<endl;
}int main()
{test01();system("pause");return 0;
}

递增运算符重载

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

#include <iostream>
#include <string>
using namespace std;//自定义整型
class MyInteger
{friend ostream& operator<<(ostream& cout,MyInteger myint);
public:MyInteger(){m_Num=0;}//重载前置++运算符   返回引用为了一直对一个数据进行递增操作MyInteger& operator++(){//先进行++运算m_Num++;//再将自身做一个返回return *this;}//重载后置++运算符MyInteger operator++(int)//int 代表占位参数,可以用于区分前置递增和后置递增{//先 记录当时结果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;
}void test02()
{MyInteger myint;cout<<myint++<<endl;cout<<myint<<endl;}int main()
{test01();test02();system("pause");return 0;
}

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

递减运算符重载

#include <iostream>
#include <string>
using namespace std;//自定义整型
class MyInteger
{friend ostream& operator<<(ostream& cout,MyInteger myint);
public:MyInteger(){m_Num=0;}//前置递减MyInteger& operator--(){m_Num--;return *this;}//后置递减MyInteger operator--(int){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;
}
void test02()
{MyInteger myint;cout<<myint--<<endl;cout<<myint<<endl;}int main()
{test01();test02();system("pause");return 0;
}

赋值运算符重载

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

1、默认构造函数  2、默认析构函数  3、默认析构函数,对属性进行值拷贝

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

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

关系运算符重载

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

#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_Name==p.m_Name&&this->m_Age==p.m_Age){return true;}return false;}bool operator!=(Person &p){if(this->m_Name==p.m_Name&&this->m_Age==p.m_Age){return false;}return true;}string m_Name;int m_Age;};void test01()
{Person p1("Tom",18);Person p2("Terry",18);if(p1==p2){cout<<"p1 和p2是相等的! "<<endl;}else{cout<<"p1和p2是不相等的!"<<endl;}if(p1!=p2){cout<<"p1和p2是不相等的!"<<endl;}else{cout<<"p1 和p2是相等的! "<<endl;}}
int main()
{test01();system("pause");return 0;
}

函数调用运算符重载

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

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

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

#include <iostream>
#include <string>
using namespace std;class MyPrint
{
public://重载函数调用运算符void operator()(string test){cout<<test<<endl;}
};void MyPrint02(string test)
{cout<<test<<endl;
}void test01()
{MyPrint myprint;myprint("hello world");//由于重载后使用的方式非常像函数的调用,因此称为仿函数MyPrint02("hello world");}//仿函数没有固定的写法,非常灵活//加法类
class MyAdd
{
public:int operator()(int num1,int num2){return num1+num2;}
};void test02()
{MyAdd myadd;int ret =myadd(100,100);cout<<"ret="<<ret<<endl;//匿名函数对象cout<<MyAdd()(100,100)<<endl;
}int main()
{test01();test02();system("pause");return 0;
}

若有侵权,请联系作者

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

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

相关文章

嵌入式软件开发工程师如何提高C语言编码技能?

嵌入式软件开发工程师如何提高C语言编码技能&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升…

vSphere 8考试认证题库 2024最新(VCP 8.0版本)

VMware VCP-DCV&#xff08;2V0-21.23&#xff09;认证考试题库&#xff0c;已全部更新&#xff0c;答案已经完成校对&#xff0c;完整题库请扫描上方二维码访问。正常考可以考到450分以上&#xff08;满分500分&#xff0c;300分通过&#xff09; An administrator is tasked …

echarts 模拟时间轴播放效果

使用echarts柱状图模拟时间轴播放控制。开始/暂停/快进/慢进/点选 代码可直接放echart官方示例执行 let start new Date(2024-01-01); let end new Date(2024-01-10); let diff end - start; let dotLen 200;let data [start, end]; option {color: [#3398DB],tooltip: …

论文解读:Rectifying the Shortcut Learning of Background for Few-Shot Learning

文章汇总 问题&动机&解决方法 图像背景是一种有害知识的来源&#xff0c;这是少数镜头学习模型容易吸收的(问题) 通过在训练和评估中提取图像中的前景目标而不需要任何额外的监督来解决这个问题(动机) 在训练和评估时将模型的注意力吸引到图像前景上(方法) 摘要 …

Day25:安全开发-PHP应用文件管理模块包含上传遍历写入删除下载安全

目录 PHP文件操作安全 文件包含 文件删除 文件编辑 文件下载 云产品OSS存储对象去存储文件(泄漏安全) 思维导图 PHP知识点 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框…

关于出国留学和考研比较----以本人双非跨考计算机为例

文章目录 中心论点国内就业现状勿让旧认知害了自己那出国留学真的一无是处了吗?1. 藤校仍旧是具有极高价值2. 时间成本低3. 研究生一定比单纯的本科找工作强!4. 很多人说出国读博好,可以无脑入,真是这样吗? 中心论点 如果在选择出国留学还是国内考研的最终核心诉求都是有更好…

向量的内积、长度、正交性

目录 向量的内积 向量的长度&#xff08;模&#xff09; 标准正交基 标准正交化 正交矩阵 向量的内积 向量的长度&#xff08;模&#xff09; 标准正交基 标准正交化 正交矩阵

JavaWeb——014SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)

SpingBoot原理 目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 3.2…

超市小程序有哪些功能 怎么制作

超市小程序是非常有用的工具&#xff0c;可以帮助超市提升用户体验&#xff0c;提高销售额。下面我们来看一下超市小程序可以具备哪些功能&#xff0c;以及如何制作一个高效的超市小程序。 1. **商品展示与搜索功能**&#xff1a;用户可以浏览超市的商品信息&#xff0c;包括价…

同等学力申硕专业介绍——管理学硕士

同等学力申硕的专业很多。 目前有十三大门类&#xff0c;分别是医学、法学、管理学、工学、教育学、经济学、艺术学、文学、历史学、理学、哲学、农学、军事学等&#xff0c;每个大门类中都有很多的细分专业。 今天为大家介绍同等学力申硕专业——管理学。 专业介绍 管理学是…

【学习记录】PointLIO代码 update_iterated_dyn_share_modified 中函数指针的用法

最近在看PointLio的代码&#xff0c;有一部分看了半天没看懂&#xff0c;学习整理如下。 1、PointLio在迭代卡尔曼部分的代码 在esekfom.hpp中&#xff0c;有部分代码如下&#xff1a; void init_dyn_share_modified(processModel f_in, processMatrix1 f_x_in, measurement…

上班族真香副业:工资4500,靠steam游戏搬砖项目月入过w

steam游戏搬砖项目已经存在好多年了&#xff0c;这个项目比较冷门且能持续稳定盈利&#xff0c;是一个非常不错的项目。即使你没玩过steam游戏也没关系&#xff0c;这个steam游戏搬砖项目既不需要你会玩游戏&#xff0c;也不需要你懂英语。 steam游戏搬砖项目的盈利点在汇率差和…

Python的数据库编程基础知识

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;如果停止&#xff0c;就是低谷&#xf…

【代码随想录算法训练营Day29】 491.递增子序列;46.全排列;47.全排列 II

文章目录 ❇️Day 29 第七章 回溯算法 part05✴️今日内容❇️491.递增子序列自己的思路随想录思路自己的代码 ❇️46.全排列思路代码流程 ❇️47.全排列 II思路代码 ❇️Day 29 第七章 回溯算法 part05 ✴️今日内容 491.递增子序列46.全排列47.全排列 II ❇️491.递增子序…

【性能测试】Jmeter+InfluxDB+Grafana 搭建性能监控平台

一、背景 为什么要搭建性能监控平台&#xff1f; 在用 Jmeter 获取性能测试结果的时候&#xff0c;Jmeter自带的测试报告如下&#xff1a; 这个报告有几个很明显的缺点&#xff1a; 只能自己看&#xff0c;无法实时共享&#xff1b;报告信息的展示比较简陋单一&#xff0c;不…

在外包公司搞了2年,出来技术都没了...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了2年的的功能…

网络工程师笔记9

动态路由 RIP路由协议 配置简单 易于维护 适用于小型网络 周期性是30s发一次

MyBatis-Plus如何娴熟运用乐观锁

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MyBatis-Plus如何娴熟运用乐观锁 前言乐观锁的基本概念基本概念和原理&#xff1a;为何乐观锁是解决并发问题的有效手段&#xff1a; MyBatis-Plus中乐观锁的支持1. Version 注解&#xff1a;2. 配置乐…

严刑拷打_微服务

文章详情 &#xff1a;&#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; 微服务相关知识 ⏱️ 创作时间&#xff1a;2024年03月8日 ———————————————— 文章目…

高级语言讲义2014计专(仅高级语言部分)

1. 已知&#xff0c;连续函数在区间[0, 3]有且只有一个实根&#xff0c;编写完整程序&#xff0c;利用二分法计算并输出该实根的近似值&#xff0c;要求结果精确到。 二分法的基本思路是:对于区间[a, b]上的连续函数f(x)&#xff0c;若f(a)和f(b)的正负号不同&#xff0c;则该区…