C++运算符重载的学习笔记

加号运算符重载

  • 两种方式
  1. 成员函数重载加号
#include  <iostream>  
using namespace std;  
//加号运算符重载  class Person  
{  
public:  
//    1.成员函数重载加号  Person operator+(Person&p)  {  Person tmp;  tmp.m_A = this->m_A + p.m_A;  tmp.m_B = this->m_B + p.m_B;  return tmp;  }  
public:  int m_A;  int m_B;  
};  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 = p1 + p2;  cout << "p3.m_A = " << p3.m_A << endl;  cout << "p3.m_B = " << p3.m_B << endl;  }    
int main()  
{  test01();  system("pause");  return 0;  
}
  1. 全局函数重载加号
#include  <iostream>  
using namespace std;  
//加号运算符重载  class Person  
{  
public:  int m_A;  int m_B;  
};  //2.全局函数重载  
Person operator+(Person&p1, Person& p2)  
{  Person tmp;  tmp.m_A = p1.m_A + p2.m_B;  tmp.m_B = p1.m_B + p2.m_B;  return tmp;  
}  void test01()  
{  Person p1;  p1.m_A = 10;  p1.m_B = 10;  Person p2;  p2.m_A = 10;  p2.m_B = 10;  //全局函数重载的本质调用  Person p3 = operator+(p1, p2);  //Person p3 = p1 + p2;  cout << "p3.m_A = " << p3.m_A << endl;  cout << "p3.m_B = " << p3.m_B << endl;  }  int main()  
{  test01();  system("pause");  return 0;  
}

3.在运算符重载中也可以发生函数重载

#include  <iostream>  
using namespace std;  
//加号运算符重载  class Person  
{  
public:  int m_A;  int m_B;  
};  //函数重载的版本  
Person operator+(Person& p1, int a)  
{  Person tmp;  tmp.m_A = p1.m_A + a;  tmp.m_B = p1.m_B + a;  return tmp;  
}  
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 + p2;  //运算符重载,也可以发生函数重载  Person p4 = p1 + 100; cout << "p4.m_A = " << p4.m_A << endl;  cout << "p4.m_B = " << p4.m_B << endl;  
}  int main()  
{  test01();  system("pause");  return 0;  
}
  • 由于编译器不知道我们的自定义类型是如何进行相加的,所以我们必须要创建一个全局的或者构造的函数来重载这个加号,以实现我们的目的

左移运算符重载

#include <iostream>
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;
};
ostream & operator <<(ostream& cout, Person& p)
{cout << p.m_A << "  " << p.m_B << endl;return cout;
}
void test01()
{Person p(10, 10);
//    p.m_A = 10;
//    p.m_B = 10;
//    cout << p.m_A << "  " <<p.m_B << endl;cout << p << "  GUET" << endl;
}
int main()
{test01();return 0;
}
  • 因为要保持cout << 这样的格式,所以在左移运算符重载中我们只用全局函数来进行重载
  • 由于我们要保留链式的特性,那么重载函数的返回值必须是对ostream&这种类型,保证返回的是同一个“东西“,才能在原来的基础上继续输出
  • 由于类中的成员变量为私有,我们必须在类中声明一下重载函数为友元

赋值运算符重载

#include <iostream>
using namespace std;
class MyInt
{friend ostream& operator<<(ostream& cout, MyInt myInt);
public:MyInt(){m_Num = 0;}MyInt& operator--(){//先--m_Num--;//再返回return *this;}MyInt operator--(int){MyInt tmp = *this;m_Num--;return tmp;}
private:int m_Num;
};
//写后置的时候会报错
ostream& operator<<(ostream& cout, MyInt myInt)//这里的MyInt我用了引用会怎么样?
{cout << myInt.m_Num << endl;
}
void test01()
{MyInt myint;cout << --(--myint) << endl;
}
void test02()
{MyInt myint;cout << myint-- << endl;cout << myint << endl;
}int main()
{test02();//test01();return 0;
}
  • 在赋值运算符的重载中要注意前置和后置的区别。
    MyInt& operator--(){//先--m_Num--;//再返回return *this;}MyInt operator--(int){MyInt tmp = *this;m_Num--;return tmp;}
  1. 返回值类型不一样,一个是返回同一个东西,另一个则是返回–之前的值
  2. 由于函数的重载不能仅靠返回值不同来区分,所以有一个函数的形参部分有个int类型来区分两个函数

原因
因为我们进行前置–,要对类创建的对象的成员变量进行修改,所以我们直接修改它本身然后返回它本身。而后置,我们不能先return否则函数提前结束,所以只能用一个临时变量来存储它被修改之前的值,然后对它本身进行修改再返回那个临时值。
同时,由于临时变量在函数结束时会销毁,那么再用引用会导致非法访问


关系运算符重载

#include <iostream>
using namespace std;
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}bool operator==(Person& p){if (m_Name == p.m_Name && m_Age == p.m_Age){return true;}return false;}bool operator!=(Person& p){if (m_Name == p.m_Name && m_Age == p.m_Age){return false;}return true;}string m_Name;int m_Age;//重载 == 号
};
void test01()
{Person p1("Tom", 19);Person p2("Tom", 18);if (p1 == p2){cout << "p1 和 p2 是相等的" << endl;}else{cout << "p1 和 p2 不相等" << endl;}
}
int main()
{test01();return 0;
}

函数调用运算符重载

#include <iostream>
using namespace std;
//函数调用运算符重载//打印输出类
class MyPrint
{
public:void operator() (string text){cout << text << endl;}
};
//相加类
class MyAdd
{
public:int operator() (int a, int b){return a + b;}
};
void test01()
{MyPrint p;p("hello GUET");
}
void test02()
{MyAdd add;cout << add(100, 200) << endl;//匿名函数对象cout << MyAdd()(200, 500) << endl;
}
int main()
{//test01();test02();return 0;
}

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

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

相关文章

DeepSeek掘金——DeepSeek-R1图形界面Agent指南

DeepSeek掘金——DeepSeek-R1图形界面Agent指南 本文将指导你完成设置 DeepSeek R1 和 Browser Use 的过程,以创建能够执行复杂任务的 AI 代理,包括 Web 自动化、推理和自然语言交互。 开源大型语言模型 (LLM) 的兴起使得创建可与 OpenAI 的 ChatGPT Operator 等专有解决方案…

K8S学习之基础六:k8s中pod亲和性

Pod节点亲和性和反亲和性 podaffinity&#xff1a;pod节点亲和性指的是pod会被调度到更趋近与哪个pod或哪类pod。 podunaffinity&#xff1a;pod节点反亲和性指的是pod会被调度到远离哪个pod或哪类pod 1. Pod节点亲和性 requiredDuringSchedulingIgnoredDuringExecution&am…

Lua | 每日一练 (4)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…

数据结构:二叉搜索树(排序树)

1.二叉搜索树的定义 二叉搜索树要么是空树&#xff0c;要么是满足以下特性的树 &#xff08;1&#xff09;左子树不为空&#xff0c;那么左子树左右节点的值都小于根节点的值 &#xff08;2&#xff09;右子树不为空&#xff0c;那么右子树左右节点的值都大于根节点的值 &#…

SpringBoot快速入门

快速入门 1). 创建springboot工程&#xff0c;并导入 mybatis的起步依赖、mysql的驱动包、lombok等。 项目工程创建完成后&#xff0c;自动在pom.xml文件中&#xff0c;导入Mybatis依赖和MySQL驱动依赖。如下所示&#xff1a; 2). 数据准备&#xff1a;创建用户表user&#xf…

DataWorks (数据工厂)介绍

介绍 DataWorks 是阿里云推出的一体化大数据开发与治理平台&#xff0c;曾用名"数据工厂""大数据开发套件" 最新版本是3.0 它是一套基于MaxCompute&#xff08;原ODPS&#xff09;的DW(数据仓库)解决方案&#xff0c;它集成了阿里多年的DW实施经验&…

信息技术知识赛系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装信息技术知识赛系统软件来发挥其高效地信息处理的作用&…

VirtualBox虚拟机转VM虚拟机

前言&#xff1a;部分靶机只适用于VirtualBox&#xff0c;VM打不开VirtualBox的文件&#xff0c;所以需要进行转换 前置条件&#xff1a;本机已经下载VM和VirtualBox 第一步&#xff1a;文件转换 找到VirtualBox.exe所在位置&#xff0c;启动cmd窗口 文件转换的命令&#xf…

ArcGIS操作:11 计算shp矢量面的质心坐标

1、打开属性表 2、添加字段 3、设置字段名称、类型 4、选择创建的字段&#xff0c;计算几何 5、选择属性质心的x坐标、坐标系&#xff08;y坐标同理&#xff09; 注意&#xff1a;计算坐标一般使用的是地理坐标系&#xff08;投影坐标系转地理坐标系教程&#xff1a;ArcGIS操作…

使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流

在现代工作与学习中&#xff0c;可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本&#xff0c;结合 Typora 快速生成流程图和甘特图&#xff0c;并通过 Markdown 格式生成思维导图&#xff0c;最终…

【Cadence仿真学习笔记】ADS Dynamic Link报错model is reserved的解决办法

首先创建好原理图 创建symbol 在library manager下就会出现symbol了 在Cadence的CIW窗口中运行ADS dynamic link 打开ADS后&#xff0c;创建对应的cellview 加入控件OPTIONS 加入网表netlist 这个时候的Netlist没有路径 点击加载symbol 把原来的netlist include删掉…

【二.提示词工程与实战应用篇】【1.提示词工程入门:AI对话的艺术】

大家好,今天咱们来聊聊一个特别有意思的话题——提示词工程。你可能已经听说过这个词,或者在使用AI工具时不经意间接触过它。但提示词工程到底是什么?它为什么这么重要?咱们今天就来深入探讨一下,看看它是如何影响我们与AI的对话,以及如何在实际应用中发挥作用的。 什么…

[密码学实战]Java实现国密(SM2)密钥协商详解:原理、代码与实践

一、代码运行结果 二、国密算法与密钥协商背景 2.1 什么是国密算法&#xff1f; 国密算法是由中国国家密码管理局制定的商用密码标准&#xff0c;包括&#xff1a; SM2&#xff1a;椭圆曲线公钥密码算法&#xff08;非对称加密/签名/密钥协商&#xff09;SM3&#xff1a;密码…

unity lua属性绑定刷新

我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候&#xff0c;我们需要刷新界面显示等级信息&#xff0c;通常我们是在收到等级升级成功的协议的时候&#xff0c;发送一个事件&#xff0c;UI界面接受到这个事件的时候&#xff0c;刷新一下等级…

制服小程序的“滑手”:禁用页面左右滑动全攻略

哈哈&#xff0c;看来你已经很聪明地发现了小程序中左右滑动的“顽皮”行为&#xff01;&#x1f604; 没错&#xff0c;我们可以通过设置 disableScroll 属性来“管教”它&#xff0c;同时结合 CSS 样式让页面既禁得住横向“乱跑”&#xff0c;又能顺畅地上下滚动。你的方案已…

蓝桥备赛(六)- C/C++输入输出

一、OJ题目输入情况汇总 OJ&#xff08;online judge&#xff09; 接下来会有例题 &#xff0c; 根据一下题目 &#xff0c; 对这些情况进行分析 1.1 单组测试用例 单在 --> 程序运行一次 &#xff0c; 就处理一组 练习一&#xff1a;计算 (ab)/c 的值 B2009 计算 (ab)/c …

Golang的性能分析指标解读

Golang的性能分析指标解读 一、概述 语言&#xff09;是一种由Google开发的开源编程语言&#xff0c;以其并发性能和高效的编译速度而闻名。对于程序员来说&#xff0c;了解如何对Golang应用程序进行性能分析是非常重要的&#xff0c;因为这能帮助他们发现潜在的性能瓶颈并对其…

【前端基础】Day 8 H5C3提高

目录 1. HTML5新特性 1.1 新增语义化标签 1.2 新增多媒体标签 1.3 新增input类型 1.4 新增表单属性 2. CSS3的新特性 2.1 新增选择器 2.1.1 属性选择器 2.1.2 结构伪类选择器 2.1.3 伪元素选择器&#xff08;重点&#xff09; 2.2 CSS3盒子模型 2.3 CSS3其他特性&a…

Android系统_Surface绘制流程

目录 一,框架图 二,核心代码 一,框架图 对上面这张图的总结 二,核心代码 /Volumes/aosp/android-8.1.0_r52/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp void SurfaceFlinger::onMessageReceived(int32_t what) {ATRACE_CALL();switch (what) {case Mes…

CDefView::_OnFSNotify函数分析

进入CDefView::_OnFSNotify函数时状态栏 _UpdateStatusBar函数之后增加一个对象&#xff0c;变成7个对象。 LRESULT CDefView::_OnFSNotify(LONG lNotification, LPCITEMIDLIST* ppidl) { LPITEMIDLIST pidl; LPCITEMIDLIST pidlItem; // we may be registered for no…