《Beginning C++20 From Novice to Professional》第十三章 Operator Overloading

embedded/2024/11/19 13:50:45/

操作符重载主要是让自定义类型有和内置类型类似的自然的操作,比如字符串的连接、矩阵的运算等等用操作符比使用成员函数(虽然也是成员函数)要直观一些

本章我们可以学到:

Implementing Operators for a Class

上一章我们实现的Truckload类有一个寻找最大体积的函数,其中有段逻辑是这样的:

比较两个数我们会自然地想到数学里的<>=运算符,而不是使用成员函数compare然后拿返回值和0比较,所以能不能写成下面这样的形式呢?

再比如两个盒子体积相加、相乘等类数学运算操作,如果写成数学表达式的形式会更有可读性

Operator Overloading 操作符重载

实际上string类里就有很多重载的操作符,比如+用来连接两个string,或者==来判断两个字符串是否相同,如果像这样设计的好,操作符重载可以让我们不加思考地写出非常优雅的代码

操作符函数本身也是函数,和普通函数不一样的地方在于,我们实现自己的版本时需要加上operator这个关键字

Implementing an Overloaded Operator

让我们来看个例子:

因为是比较,所以小于操作符函数的返回类型应该是bool;这里参数表示的是操作符的第二个操作对象,假如a<b,那么相当于a.operator<(b),a是调用这个成员操作符函数的对象,b就是这个函数的参数;const不多说了,比较操作应该对对象数据是只读的

然后用了这个形式(先不管实现),我们就可以写成下面的比较

书中也提供了一幅图来说明上面的过程,还提供了实现(就一行)

下面代码用来验证重载的比较操作

注意我们的smallBox是用来存储最大值的对象,在循环过程中只要发现有比之前大的就重新赋值,这里的=其实也是一个操作符,但是我们并没有实现,因为编译器默认给所有类生成一个赋值运算符函数,把右侧对象给复制到左边,行为就像复制构造函数

但是这个默认赋值操作有时候并不能完全满足实际需要,后面的小节里我们会说到这个问题

Nonmember Operator Functions

#include <iostream>
#include <vector>
using namespace std;class Box {public:// ConstructorsBox() = default;Box(double l, double w, double h) : m_length{l}, m_width{w}, m_height{h} {}double volume() const { return m_length * m_width * m_height; }// Accessorsdouble getLength() const { return m_length; }double getWidth() const { return m_width; }double getHeight() const { return m_height; }private:double m_length{1.0};double m_width{1.0};double m_height{1.0};
};bool operator<(const Box& box1, const Box& box2) { return box1.volume() < box2.volume(); }int main() {std::vector boxes{Box{2.0, 2.0, 3.0},Box{1.0, 3.0, 2.0},Box{1.0, 2.0, 1.0},Box{2.0, 3.0, 3.0}};Box smallBox{boxes[0]};for (const auto& box: boxes) {if (box < smallBox)smallBox = box;}std::cout << "The smallest box has dimensions "<< smallBox.getLength() << 'x'<< smallBox.getWidth() << 'x'<< smallBox.getHeight() << std::endl;
}

对于<这样的两元运算符,一般还是重


http://www.ppmy.cn/embedded/138777.html

相关文章

Mybatis框架之单例模式 (Singleton Pattern)

MyBatis 框架中也使用到了单例模式 (Singleton Pattern)&#xff0c;主要体现在 SqlSessionFactory 的创建和管理上。通过单例模式&#xff0c;MyBatis 可以确保整个应用程序中只创建一个 SqlSessionFactory 实例&#xff0c;从而有效地管理数据库连接资源并提高性能。下面将详…

wsl配置ubuntu22.04,并配置docker

wsl配置ubuntu22.04&#xff0c;并配置docker 文章目录 wsl配置ubuntu22.04&#xff0c;并配置docker一、在Windows上安装Linux子系统前提条件安装步骤 二、wsl安装系统到其他盘①查看wsl运行状态&#xff0c;将其保持在关闭状态②导出当前Linux的镜像③注销之前的系统并检查④…

系统思考—跳出症状看全局

在和企业创办人交流中&#xff0c;经常听到这样的疑问&#xff1a;“为什么我们试了这么多办法&#xff0c;问题却还是没有解决&#xff1f;”其实很多时候&#xff0c;根本原因并不在于对策不到位&#xff0c;而是连问题的本质都没找对。 曾经和一家企业合作&#xff0c;为了解…

大数据-225 离线数仓 - 目前需求分析 指标口径 日志数据采集 taildir source HDFS Sink Agent Flume 优化配置

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

栈Stack和队列Queue

目录 一、栈 &#xff08;1&#xff09;用数组实现 &#xff08;2&#xff09;用单链表实现 &#xff08;3&#xff09;用标注尾结点的单链表实现 &#xff08;4&#xff09;用双向链表实现 2、栈的实际应用 &#xff08;1&#xff09;改变元素的序列 &#xff08;2&am…

学习日记_20241110_聚类方法(K-Means)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

R语言/Rstudio 报错

记录R语言和Rstudio的报错&#xff1a; 1. Error 28 (inotify_add_watch: No watches available) File monitoring failed for project at "~xxx" Error 28 (inotify_add_watch: No watches available) Features disabled: R source file indexing, Diagnostics不少…

力扣(leetcode)题目总结——辅助栈篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…