C++学习第十四课:运算符类型与运算符重载

在这里插入图片描述

C++学习第十四课:运算符类型与运算符重载

在C++中,运算符重载是一种使得自定义类型(如类对象)能够使用C++内建运算符的能力。运算符重载允许程序员定义运算符对用户定义类型的特殊行为,这增加了程序的可读性和自然表达能力。本课将详细介绍C++中的运算符类型、运算符重载的概念、语法和示例。

1. C++中的运算符类型

C++提供了多种运算符,它们可以按功能分为以下几类:

  • 算术运算符+, -, *, /, %(取余)。
  • 关系运算符>, <, >=, <=, ==, !=
  • 逻辑运算符&&(逻辑与), ||(逻辑或), !(逻辑非)。
  • 位运算符&, |, ^, ~, <<(左移), >>(右移)。
  • 赋值运算符=, +=, -=, *=, /=, %= 等。
  • 其他运算符sizeof, new, delete 等。

2. 运算符重载的概念

运算符重载允许改变运算符对用户定义类型的行为。C++支持以下几种重载方式:

  • 成员函数:将运算符重载为类的成员函数。
  • 友元函数:将运算符重载为类的友元函数。
  • 转换运算符:允许类对象被视为其他类型。

3. 运算符重载的语法

运算符重载可以通过成员函数或友元函数实现。以下是重载加法运算符为友元函数的示例:

class Vector {
public:int x, y;// 友元函数,重载加法运算符friend Vector operator+(const Vector& v1, const Vector& v2);
};Vector operator+(const Vector& v1, const Vector& v2) {return Vector(v1.x + v2.x, v1.y + v2.y);
}

4. 成员函数重载运算符

运算符也可以作为类的成员函数被重载:

class Complex {
public:double real, imag;// 成员函数重载加法运算符Complex operator+(const Complex& rhs) const {return Complex(real + rhs.real, imag + rhs.imag);}
};

5. 输入输出流运算符重载

重载输入输出流运算符可以方便地读写类对象:

std::ostream& operator<<(std::ostream& os, const Vector& v) {os << "(" << v.x << ", " << v.y << ")";return os;
}std::istream& operator>>(std::istream& is, Vector& v) {is >> v.x >> v.y;return is;
}

6. 关系运算符重载

关系运算符常用于比较类对象:

bool operator<(const Vector& lhs, const Vector& rhs) {return (lhs.x == rhs.x) ? lhs.y < rhs.y : lhs.x < rhs.x;
}

7. 赋值运算符重载

赋值运算符允许定义类对象的赋值行为:

class MyClass {
public:int value;MyClass& operator=(const MyClass& other) {if (this != &other) {value = other.value;// 深拷贝资源(如果有的话)}return *this;}
};

8. 运算符重载与构造函数

构造函数不能被重载,但可以模拟运算符的行为:

class String {
public:char* str;String(const char* s) {str = new char[strlen(s) + 1];strcpy(str, s);}// 模仿赋值运算符的构造函数String& operator=(const String& rhs) {if (this != &rhs) {delete[] str;str = new char[strlen(rhs.str) + 1];strcpy(str, rhs.str);}return *this;}~String() {delete[] str;}
};

9. 运算符重载的规则

  • 运算符重载不能改变运算符的语法或优先级。
  • 不能重载所有的运算符,如 ., ::, .*, sizeof 等。
  • 运算符重载应保持其原有的语义。

10. 特殊运算符重载:函数调用运算符 operator()

函数调用运算符允许类对象表现得像函数一样:

class MathFunc {
public:// 重载函数调用运算符double operator()(double x) const {return x * x + 2 * x + 1;}
};

11. 特殊运算符重载:下标运算符 operator[]

下标运算符允许使用数组的下标访问类对象:

class Array {int* data;int size;
public:int& operator[](int index) {return data[index];}const int& operator[](int index) const {return data[index];}
};

12. 运算符重载与类型转换

运算符重载可以用于类型转换:

class Rational {int numerator, denominator;
public:// 类似于隐式类型转换的运算符重载operator double() const {return static_cast<double>(numerator) / denominator;}
};

结语

通过本课的学习,你了解了C++中运算符重载的概念、语法和示例。运算符重载是C++的一个强大特性,它使得自定义类型能够使用C++内建运算符,提高了程序的表达能力。

正确使用运算符重载可以增加代码的可读性和一致性,但滥用运算符重载会使代码变得难以理解和维护。因此,运算符重载应遵循明确、一致和可预测的原则。

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

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

相关文章

PaLmTac嵌入软体手手掌的视触觉传感器

触觉是感知和操作之间的桥梁。触觉信息对于手部行为反馈和规划具有重要意义。软体手的柔性特性在人机交互、生物医学设备和假肢等方面具有潜在应用的优势。本文提出了一种名为 PaLmTac的嵌入软体手手掌的视触觉传感器&#xff08;vision-based tactile sensor, VBTS&#xff09…

学习mysql相关知识记录

执行一条select语句&#xff0c;期间发生了什么&#xff1f; MySQL的执行流程&#xff1a; 连接器 TCP连接 查询缓存 很鸡肋被取消 解析SQL 解析器 语法分析词法分析 执行SQL 预处理器 检查是否存在将 select * 中的 * 符号&#xff0c;扩展为表上的所有列 优化器 优化器主要…

LeetCode 198—— 打家劫舍

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此题使用动态规划求解&#xff0c;假设 d p [ i ] [ 0 ] dp[i][0] dp[i][0] 代表不偷窃第 i i i 个房屋可以获得的最高金额&#xff0c;而 d p [ i ] [ 1 ] dp[i][1] dp[i][1] 代表偷窃第 i i i 个房屋可以获…

Bluetooth Profile 蓝牙协议栈总结

GAP-Generic Access Profile 控制设备广播和连接 GAP profile 的目的是描述&#xff1a; Profile rolesDiscoverability modes and proceduresConnection modes and proceduresSecurity modes and procedures 设备连接过程 LE中GAP有4种角色&#xff1a;BroadcasterObserv…

关于npm命令

我们知道nodejs安装后&#xff0c;用npm命令来安装管理依赖包&#xff0c;npm默认源是https://registry.npmjs.org 国内访问可能不够快&#xff0c;所以大家一般会配置使用国内镜像源&#xff0c;比如https://registry.npmmirror.com &#xff0c;这样可能访问和下载会快一些。…

RTMP 直播推流 Demo(二)—— 音频推流与视频推流

音视频编解码系列目录&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff09;—— 音频解码与音视频同步 RTMP 直播推流 Demo&#xff08;一&#xff09;—— 项目…

vue计算属性是什么 怎么选择?

写在computed对象中的属性&#xff0c;本质上是一个方法&#xff0c;不过使用时依旧当属性来使用 虽然模板语法使用非常便利&#xff0c;但是它是被设计成用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护 无论计算属性还是methos&#xff0c;这两种实现方式的…

抽象类和接口的区别你知道吗

抽象类和接口是Java中两种重要的机制&#xff0c;它们都用于实现多态性和代码的灵活性&#xff0c;但在某些方面有着不同的特点。下面我将详细介绍抽象类和接口的区别&#xff0c;并通过示例进行说明。 抽象类&#xff08;Abstract Class&#xff09; 定义&#xff1a; 抽象类…

暴雨服务器引领信创算力新潮流

去年大模型的空前发展&#xff0c;人工智能也终于迎来了属于自己的“文艺复兴”&#xff0c;众多的模型相继发布&#xff0c;继而催生了整个行业对于智能算力需求的激增。 市场需求与技术驱动仿佛现实世界的左右脚&#xff0c;催动着世界文明的齿轮向前滚动。在全球经济角逐日…

力扣:61. 旋转链表(Java,双指针)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码描述&#xff1a; 题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 输入&#xff1a; head [1,2,3,4,5], k 2 输出&#xff1a; [4,5,1,…

Win系统常用操作

文章目录 1、常用快捷键 1、常用快捷键 锁屏&#xff1a;WinL截屏&#xff1a;WInShiftS新建文件夹&#xff1a;CtrlShiftN关闭程序&#xff1a;CtrlW放大/缩小页面&#xff1a;Ctrl加号/减号最小化当前窗口&#xff1a;Alt空格N返回桌面&#xff1a;WinD&#xff08;再次按Wi…

linux高性能服务器--定长内存池设计

内存池 内存池是指程序预先从操作系统申请一块足够大内存&#xff0c;此后当程序中需要再次申请内存的时候&#xff0c;直接从内存池中获取&#xff1b;当程序释放内存的时候&#xff0c;是返回给内存池保管。 开源内存池&#xff1a; tcmalloc 功能&#xff1a; 避免频繁分…

扒开kafka内部组件,咱瞅一瞅都有啥?

Apache Kafka 是一个分布式流处理平台&#xff0c;主要用于构建实时数据管道和流式应用程序。它由几个核心组件组成&#xff0c;这些组件共同工作以提供高吞吐量、持久性、容错性和可扩展性。关于 Kafka 与其它类似的中间件的对比&#xff0c;这里V 哥就不再阐述了&#xff0c;…

leetcode-滑动窗口的最大值-95

题目要求 思路 1.这个题是可以暴力求解的&#xff0c;但是时间复杂度比较高&#xff0c;因此&#xff0c;这里说一个时间复杂度为O(n)的方法 2.因为这个代码是优化后的结果&#xff0c;第一次写如果直接写成这样着实不容易&#xff0c;因此&#xff0c;我直接讲每一行的含义。…

Linux系统应用与设置(1):比较、生成补丁以及应用补丁(diff与patch指令)

1. 简述 在我们应用Linux系统或基于Linux系统做一些软件应用开发时&#xff0c;经常会遇到需要将文件的改动记录下来&#xff0c;并且讲这些改动和差异应用到其他的Linux系统时&#xff0c;我们会用到diff和patch指令。 在Linux中&#xff0c;diff和patch是两个非常有用的命令行…

【网络基础】深入理解TCP协议:协议段、可靠性、各种机制

文章目录 1. TCP协议段格式1.1. 如何解包 / 向上交付1.1.1. 交付1.1.2. 解包 1.2. 如何理解可靠性1.2.1. 确认应答机制&#xff08;ACK&#xff09;1.2.2. 序号 与 确认序号 2. TCP做到全双工的原因2.1. 16位窗口大小2.2. 6个标记位 3. 如何理解连接3.1 连接管理机制3.1.1. 三次…

44. UE5 RPG 初始化敌人的属性

在正常的游戏中&#xff0c;我们应该考虑如何去初始化角色属性&#xff0c;并且要给角色分好类型。比如&#xff0c;在我们游戏中&#xff0c;我们如何去初始化小兵的属性&#xff0c;并且还要实现小兵随着等级的增长而增加属性。而且就是小兵也有类型的区分&#xff0c;比如我…

【数组】Leetcode 26. 删除有序数组中的重复项【简单】

删除有序数组中的重复项 其他算法导航栏 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 …

【C++STL】String类的常用函数用法总结

String类 一&#xff1a;String类的初始化方式二&#xff1a;String类的访问方式三&#xff1a;String的大小和容量四&#xff1a;string的插入&#xff1a;push_back() 和 insert()五&#xff1a;string拼接字符串&#xff1a;append() & 操作符六&#xff1a; string的删…

PhpAdmin-getshell

PhpAdmin-getshell 通过未授权成功写入&#xff0c;然后getshell 路径&#xff1a;C:\phpstudy_pro\Extensions\MySQL5.7.26\ 写入木马&#xff1a; into写入文件&#xff1a; 使用需看要secure_file_priv的值。 当value为“null”时&#xff0c;不允许读取任意文件 当value为…