2.类和对象-运算符重载

文章目录

  • 运算符重载
    • 1.+运算符重载
    • 2.<<运算符重载
    • 3.++运算符重载
    • 4.=运算符重载
    • 5.==和!=运算符重载
    • 6.()运算符重载

运算符重载

1.+运算符重载

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>using namespace std;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_B;//	return temp;//}int m_A;int m_B;
};/*全局函数重载*/
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;
}void test1()
{Person p1;p1.m_A = 10;p1.m_B = 20;Person p2;p2.m_A = 100;p2.m_B = 200;cout << "p1.m_A = " << p1.m_A << endl;cout << "p1.m_B = " << p1.m_B << endl;cout << "p2.m_A = " << p2.m_A << endl;cout << "p2.m_B = " << p2.m_B << endl;Person p3 = p1 + p2;cout << "p3.m_A = " << p3.m_A << endl;cout << "p3.m_B = " << p3.m_B << endl;return;
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

2.<<运算符重载

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>using namespace std;class Person
{friend ostream& operator<<(ostream& cout, Person& p);/*全局函数做友元,确保可以访问私有成员的值*/
public:Person(int a, int b){m_A = a;m_B = b;}
private:int m_A;int m_B;
};/*只能利用全局函数来重载<<运算符*/
/*利用成员函数重载 左移运算符 p.operator<<(cout) 简化 就是 p<<cout 不符合要求*/
ostream& operator<<(ostream &cout, Person &p)
{cout << "p.m_A = " << p.m_A << endl << "p.m_B = " << p.m_B;return cout;/*链式编程思想 返回一个ostream& (输出流)*/
}void test1()
{Person p(10, 20);cout << p << endl;/*<< 重载过后可以直接输出p的m_A和m_B的值*/return;
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

3.++运算符重载

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>using namespace std;class MyType
{
public:MyType(){m_A = 0;}/*重载前置++运算符--返回引用是为了累加时,是对同一个变量操作*/MyType& operator++(){m_A++;return *this;}/*重载后置++运算符--返回引用是为了累加时,是对同一个变量操作*//*1.int 代表占位参数,可以用于区分前置递增和后置递增*//*2.返回值没有返回引用,是因为局部变量在函数结束时,就要释放掉*/MyType operator++(int){/*先记录值*/MyType temp = *this;/*完成递增*/m_A++;/*返回记录值*/return temp;}int m_A;
};ostream& operator<<(ostream& cout, MyType &m)
{cout << "m_A = " << m.m_A;return cout;
}void test1()
{MyType m;cout << ++m << endl;cout << ++m << endl;cout << m << endl;return;
}void test2()
{MyType m;m++;cout << m << endl;return;
}int main()
{//test1();test2();return 0;
}

运行结果:(test1函数运行)
在这里插入图片描述
运行结果:(test2函数运行)
在这里插入图片描述

4.=运算符重载

#define _CRT_SECURE_NO_WARNINGS
#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){/*先判断是否有属性在堆区,有的话先释放干净,然后再深拷贝*/if (m_Age != NULL){delete m_Age;m_Age = NULL;}/*深拷贝*/m_Age = new int(*p.m_Age);/*返回对象本身*/return *this;}int* m_Age;
};void test1()
{Person p1(10);Person p2(20);Person p3(30);p3 = p2 = p1;cout << *p1.m_Age << endl;cout << *p2.m_Age << endl;cout << *p3.m_Age << endl;
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

5.==和!=运算符重载

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>using namespace std;class ID
{
public:bool operator==(ID &p){if ((this->name == p.name) && (this->age == p.age)){return true;}return false;}bool operator!=(ID& p){if ((this->name == p.name) && (this->age == p.age)){return false;}return true;}string name;int age;
};void test1()
{ID s1;s1.name = "玛丽";s1.age = 20;ID s2;s2.name = "玛丽";s2.age = 20;if (s1 == s2){cout << "s1 和 s2 是相等的!" << endl;}else{cout << "s1 和 s2 是不相等的!" << endl;}if (s1 != s2){cout << "s1 和 s2 是不相等的!" << endl;}else{cout << "s1 和 s2 是相等的!" << endl;}return;
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

6.()运算符重载

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>using namespace std;class Print
{
public:void operator()(string str)/*重载()运算符--也叫仿函数*/{cout << str << endl;}
};class Add
{
public:int operator()(int num1, int num2)/*重载()运算符*/{return (num1 + num2);}
};void test1()
{Print p;p("hello world!");Add a;cout << a(50, 50) << endl;/*匿名函数对象*/cout << Add()(10, 20) << endl;
}int main()
{test1();return 0;
}

运行结果:
在这里插入图片描述

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

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

相关文章

纯css实现太极八卦图

感觉最近好像闯鬼了&#xff0c;赶紧写个八卦图避避邪&#xff0c;开玩笑了&#xff0c;不废话&#xff0c;上菜&#xff0c;看效果上代码。 效果 代码&#xff0c;你们都是大佬&#xff0c;这里就不解释代码了 &#xff08;hover会转动喔&#xff09;。 <!DOCTYPE html&g…

【netty系列-02】深入理解socket本质和BIO底层实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478 深入理解socket本质和bio底层实现 …

Go编译报错 link: running gcc failed: exit status 1(已解决)

背景 在对一个开源的Go程序二次开发 重新编译时 &#xff0c; 报错截图如下 报错文字如下&#xff1a;关键信息 link: running gcc failed: exit status 1 $ go build -o orchestrator-didi -i go/cmd/orchestrator/main.go go build: -i flag is deprecated # command-li…

Lego-loam 算法三维建图

运行环境 Linux&#xff1a;Ubuntu18.04ros&#xff1a;MelodicCeres Solver 2.0.0&#xff08;Ubuntu18.04安装Ceres&#xff09;PCL 1.8.1&#xff08;Ubuntu系统的PCL、Eigen卸载和安装&#xff09; 运行数据集 lego-loam 39/39 终端一&#xff1a;进入catkin_ws工作空间…

【Flink网络数据传输】OperatorChain的设计与实现

文章目录 1.OperatorChain的设计与实现2.OperatorChain的创建和初始化3.创建RecordWriterOutput 1.OperatorChain的设计与实现 OperatorChain的大致逻辑 在JobGraph对象的创建过程中&#xff0c;将链化可以连在一起的算子&#xff0c;常见的有StreamMap、StreamFilter等类型的…

字符函数

1.字符分类函数 专门做字符分类的函数&#xff0c;都包含一个头文件#include <ctype.h> islower() 是一个用于判断字符是否为小写字母的函数。 通常情况下&#xff0c;如果一个字符是小写字母&#xff0c;则 islower() 函数会返回 true 或者一个表示真的值&#xff08…

【变量提升】关于JavaScript变量提升的理解,它导致了什么问题?

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

大模型笔记:最少到最多提示过程 (Least to Most prompting, LtM)

LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS 2023 ICLR 1 概述 进一步发展维链提示过程 (CoT prompting) 分为两个阶段&#xff1a; 第一阶段&#xff1a;向语言模型提出查询&#xff0c;将问题分解成子问题。第二阶段&#xff1a;再次向语…

Z Potentials | 星爵,他的征途不止向量数据库

纵观过去几十年的科技发展史&#xff0c;每一代新的技术架构的出现往往都伴随着新的数据范式的出现&#xff0c;也催生了多家百亿到千亿美金数据平台的诞生。如果说 2023 年科技领域的关键词是 LLM&#xff0c;那么数据库领域的关键词一定非向量数据库莫属。向量数据库是一种专…

SpringMVC拦截器和过滤器执行顺序及区别

拦截器&#xff08;Inteceptor&#xff09;和过滤器&#xff08;Filter&#xff09;执行顺序&#xff1f; 拦截器和过滤器区别&#xff1f; 1、拦截次数不同&#xff1a; 过滤器&#xff1a;一次请求只能被一个过滤器拦截一次&#xff0c;它们按照在web.xml中的声明顺序依次执…

IJCAI23 - Continual Learning Tutorial

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 本篇 Tutorial 主要介绍了 CL 中的一些基本概念以及一些过往的方法。 Problem Definition Continual Learning 和 Increm…

DataX及使用

DataX及使用 【一】DataX概述【二】DataX架构原理【1】设计理念【2】框架设计【3】运行流程【4】调度决策思路【5】DataX和Sqoop对比 【三】DataX部署【四】DataX上手【1】使用概述【2】配置文件格式【3】同步Mysql数据到HDFS 【五】DataX整合Springboot 【一】DataX概述 Data…