C++中一些常见的运算符重载代码模板

news2024/9/23 21:29:46

可重载和不可重载的运算符

C++中可重载的运算符如下:

而不可重载的运算符如下:

运算符重载的代码模板

 下面是代码中形参的统一解释:

lhs: 左操作数,通常为运算符左侧的对象或值。
rhs: 右操作数,通常为运算符右侧的对象或值。
val: 通常代表一个对象或值。
shift: 用于位运算的位移量,通常为一个整数值。
ptr: 通常代表一个指针对象。
member: 成员访问运算符的右操作数,它是一个类的成员指针。

index: 下标运算符的右操作数,它表示要访问的元素的索引。

还有一点,下面的代码大多数是将运算符重载函数写做普通的函数模板,并没有声明为类的成员函数。如果想要将对应的重载写成类的成员函数,那么只需要去掉函数中的第一个参数,一般来说第一个参数可以看作是被this指针代替了。(下面的标题是与上面的图片内容相对应的)

至于空间申请与释放运算符,由于太过复杂,所以就不写了。

双目算术运算符 (+, -, *, /, %)

// 加运算符重载
template <typename T>
T operator+(const T& lhs, const T& rhs) {
    return lhs + rhs;
}
// 减运算符重载
template <typename T>
T operator-(const T& lhs, const T& rhs) {
    return lhs - rhs;
}
// 乘运算符重载
template <typename T>
T operator*(const T& lhs, const T& rhs) {
    return lhs * rhs;
}
// 除运算符重载
template <typename T>
T operator/(const T& lhs, const T& rhs) {
    return lhs / rhs;
}
// 取模运算符重载
template <typename T>
T operator%(const T& lhs, const T& rhs) {
    return lhs % rhs;
}

关系运算符 (==, !=, <, >, <=, >=)

// 等于运算符重载
template <typename T>
bool operator==(const T& lhs, const T& rhs) {
    return lhs == rhs;
}
// 不等于运算符重载
template <typename T>
bool operator!=(const T& lhs, const T& rhs) {
    return lhs != rhs;
}
// 小于运算符重载
template <typename T>
bool operator<(const T& lhs, const T& rhs) {
    return lhs < rhs;
}
// 大于运算符重载
template <typename T>
bool operator>(const T& lhs, const T& rhs) {
    return lhs > rhs;
}
// 小于等于运算符重载
template <typename T>
bool operator<=(const T& lhs, const T& rhs) {
    return lhs <= rhs;
}
// 大于等于运算符重载
template <typename T>
bool operator>=(const T& lhs, const T& rhs) {
    return lhs >= rhs;
}

逻辑运算符 (!, &&, ||)

// 非运算符重载
template <typename T>
bool operator!(const T& val) {
    return !val;
}
// 与运算符重载
template <typename T>
bool operator&&(const T& lhs, const T& rhs) {
    return lhs && rhs;
}
// 或运算符重载
template <typename T>
bool operator||(const T& lhs, const T& rhs) {
    return lhs || rhs;
}

单目运算符(+,-,*,&)

// 正号运算符重载
template <typename T>
T operator+(const T& val) {
    return +val;
}
// 负号运算符重载
template <typename T>
T operator-(const T& val) {
    return -val;
}
// 指针运算符重载
template <typename T>
T& operator*(T* ptr) {
    return *ptr;
}

template <typename T>
const T& operator*(const T* ptr) {
    return *ptr;
}
// 取地址运算符重载
template <typename T>
const T* operator&(const T& val) {
    return &val;
}

template <typename T>
T* operator&(T& val) {
    return &val;
}

自增自减运算符(++,--)

// 自增运算符重载
template <typename T>
T& operator++(T& val) { //前置++
    ++val;
    return val;
}

template <typename T>
T operator++(T& val, int) { //后置++
    T old = val;
    ++val;
    return old;
}
// 自减运算符重载
template <typename T>
T& operator--(T& val) { //前置--
    --val;
    return val;
}

template <typename T>
T operator--(T& val, int) { //后置--
    T old = val;
    --val;
    return old;
}

位运算符 (&, |, ^, ~, <<, >>)

// 按位与重载
template <typename T>
T operator&(const T& lhs, const T& rhs) {
    return lhs & rhs;
}
// 按位或重载
template <typename T>
T operator|(const T& lhs, const T& rhs) {
    return lhs | rhs;
}
// 按位异或重载
template <typename T>
T operator^(const T& lhs, const T& rhs) {
    return lhs ^ rhs;
}
// 按位取反重载
template <typename T>
T operator~(const T& val) {
    return ~val;
}
// 左移运算符重载
template <typename T>
T operator<<(const T& val, int shift) {
    return val << shift;
}
// 右移运算符重载
template <typename T>
T operator>>(const T& val, int shift) {
    return val >> shift;
}

赋值运算符 (=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=)

// =运算符重载
template <typename T>
T& operator=(T& lhs, const T& rhs) {
    lhs = rhs;
    return lhs;
}
// +=运算符重载
template <typename T>
T& operator+=(T& lhs, const T& rhs) {
    lhs += rhs;
    return lhs;
}
// -=运算符重载
template <typename T>
T& operator-=(T& lhs, const T& rhs) {
    lhs -= rhs;
    return lhs;
}
// *=运算符重载
template <typename T>
T& operator*=(T& lhs, const T& rhs) {
    lhs *= rhs;
    return lhs;
}
// /=运算符重载
template <typename T>
T& operator/=(T& lhs, const T& rhs) {
    lhs /= rhs;
    return lhs;
}
// %=运算符重载
template <typename T>
T& operator%=(T& lhs, const T& rhs) {
    lhs %= rhs;
    return lhs;
}
// &=运算符重载
template <typename T>
T& operator&=(T& lhs, const T& rhs) {
    lhs &= rhs;
    return lhs;
}
// |=运算符重载
template <typename T>
T& operator|=(T& lhs, const T& rhs) {
    lhs |= rhs;
    return lhs;
}
// ^=运算符重载
template <typename T>
T& operator^=(T& lhs, const T& rhs) {
    lhs ^= rhs;
    return lhs;
}
// <<=运算符重载
template <typename T>
T& operator<<=(T& val, int shift) {
    val <<= shift;
    return val;
}
// >>=运算符重载
template <typename T>
T& operator>>=(T& val, int shift) {
    val >>= shift;
    return val;
}

其它运算符((),, ,[])

// 函数调用运算符 重载
// 这里只是展示一种模板泛化版本
// 具体的实现要根据实际需求进行定义。
template <typename ReturnType, typename... Args>
ReturnType operator()(Args&&... args) {
    // 在这里实现函数调用的逻辑
    // 返回合适的类型对象
}

// 逗号运算符重载
template <typename T>
T operator,(const T& lhs, const T& rhs) {
    return (void(lhs), rhs); // 逗号运算符的返回值是右操作数的值
}
// 下标运算符重载
template <typename T, typename IndexType>
decltype(auto) operator[](T& val, const IndexType& index) {
    return val[index];
}
template <typename T, typename IndexType>
decltype(auto) operator[](const T& val, const IndexType& index) {
    return val[index];
}

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

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

相关文章

性能测试、负载测试、压力测试-之间的差异

性能测试、负载测试、压力测试-之间的差异 目录 1、什么是性能测试2、什么是负载测试3、什么是压力测试4、性能测试 vs 负载测试 vs 压力测试5、为什么要进行性能测试6、为什么要进行负载测试7、为什么要进行压力测试8、什么时候使用性能测试9、什么时候使用负载测试10、什么时…

【数据结构】实验七:字符串

实验七 字符串实验报告 一、实验目的与要求 1&#xff09;巩固对串的理解&#xff1b; 2&#xff09;掌握串的基本操作实现&#xff1b; 3&#xff09;掌握 BF 和 KMP 算法思想。 二、实验内容 1. 给定一个字符串ababcabcdabcde和一个子串abcd,查找字串是否在主串中出现。…

Ansible安装部署与应用

文章目录 一、ansible简介二、ansible 环境安装部署三、ansible 命令行模块3.1 command 模块3.2 shell 模块3.3 cron 模块3.4 user 模块3.5 group 模块3.6 copy 模块3.7 file 模块3.8 hostname 模块3.9 ping 模块3.10 yum 模块3.11 service/systemd 模块3.12 script 模块3.13 m…

可穿戴设备的发展

目录 1.什么是可穿戴设备 2.可穿戴设备的发展过程 3.可穿戴设备带来的福利 4.可穿戴设备未来的发展趋势 1.什么是可穿戴设备 可穿戴设备是指可以佩戴在身体上并与用户进行交互的电子设备。它们通常以小型、便携和智能化的形式呈现&#xff0c;与用户的服装、配饰或身体部位相…

nplayer读取电脑共享文件

Step 1&#xff1a; 在电脑中开启共享。 ▼想要访问电脑中的文件&#xff0c;电脑上需要有一个含密码的账户。 所以没有密码的首先得去控制面板为当前用户添加一个密码。 ▼下面添加共享文件夹。比如我们想共享music文件夹&#xff0c;则右键该文件夹>属性>共享>高级…

ChatGPT安卓版正式发布,附安装包,但有款手机无法使用

ChatGPT安卓版如约而至&#xff0c;OpenAI正式宣布该应用已在谷歌应用商店上架&#xff0c;用户可以免费下载&#xff0c;对话不限次数。 但是安卓版ChatGPT目前仅在美国、印度、孟加拉国和巴西提供下载&#xff0c;下周将会推广至更多国家。 网页端下载链接&#xff1a; http…

POM+数据驱动+pytest

POM数据驱动pytest 数据驱动&#xff1a;将测试过程中所有测试数据&#xff0c;进行提取、保存以及管理&#xff0c;提升框架的可维护性&#xff0c;一般情况下会使用到的数据类型&#xff1a;Excel、yaml、json、py......&#xff0c;如&#xff1a;登录场景&#xff0c;需要…

《长沙市“1+2+N”先进制造业集群提质升级研究》 课题调研组莅临麒麟信安展开专题调研

为提质升级长沙“12N”先进制造业产业集群&#xff0c;构建与现代产业体系相适应的产业生态&#xff0c;7月11日下午&#xff0c;由长沙市制造业发展促进中心党委书记沈群等市制造业发展促进中心相关领导以及中南大学王昶、卢锋华、朱思文等教授和多位博士、硕士组成的《长沙市…

视频剪辑矩阵分发系统Unable to load FFProbe报错技术处理?

问题一 报错处理 对于视频剪辑矩阵分发系统中出现的“Unable to load FFProbe”报错问题&#xff0c;可以采取以下技术处理措施进行解决。 1.检查系统中是否正确安装了FFProbe工具&#xff0c;并确保其路径正确配置。 2.检查系统环境变量是否正确设置&#xff0c;包括FFPr…

Rete算法相关内容与实例,搞懂Rete算法这一篇文章就够了,有我自己的理解,也有经典的例子详解,非常详细

Rete算法是一个规则匹配算法,是一个高效的规则匹配算法。Drools从3.X版本到7.X版本一直都是基于Rete算法实现规则匹配的,为了进一步了解Drools,所以就研究一下Rete算法。 Rete算法是由美国工程师Charles L. Forgy在1979年提出的。 该算法的设计的目的就是用于高效地处理规…

【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

生活案例 咖啡厅 咖啡定制案例 在咖啡厅中&#xff0c;有多种不同类型的咖啡&#xff0c;客户在预定了咖啡之后&#xff0c;还可以选择添加不同的调料来调整咖啡的口味&#xff0c;当客户点了咖啡添加了不同的调料&#xff0c;咖啡的价格需要做出相应的改变。 要求&#xff…

SAP安装笔记

1、准备安装介质&#xff0c;SWPM10SP25&#xff0c;51050829_NW750_JavaExport、SAP_HANA_CLIENT、kernel放到/sapcd/NetWeaver目录下 ​​​​​​​ 进入SWPM10SP25执行./sapinst安装 2、待出现 “Open your browser and paste the following URL address to access the G…

如何从0开始搭建公司自动化测试框架?25k入职新公司的我是这样做的..

搭建的自动化测试框架要包括API测试&#xff0c;UI测试&#xff0c;APP测试三类。以上三类其实可以简化为两类&#xff0c;那就是&#xff1a; 1&#xff09;接口自动化测试框架搭建 2&#xff09;UI自动化测试框架搭建。 没问题&#xff0c;安排&#xff0c;且是手把手教你如何…

高校宿舍报修管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科技的发展&#xff0c;信息化的管理手段早以在人们生活的各个方面取代了传统的管理手段&#xff0c;以先进管理理念为基础的现代化信息管理系统已经成为了许多机构的必备工具。在如今大学的校园里&#xff0c;有着许许多多的信息化管理系统&#xff0c;如图书管理系…

尚医通06:数据字典+EasyExcel+mongodb

内容介绍 1、数据字典列表前端 2、EasyExcel介绍、实例 3、数据字典导出接口、前端 4、数据字典导入接口、前端 5、数据字典添加redis缓存 6、MongoDB简介 7、MongoDB安装 8、MongoDB基本概念 数据字典列表前端 1、测试问题 &#xff08;1&#xff09;报错日志 &am…

LabVIEW开发小型减阻试验平台

LabVIEW开发小型减阻试验平台 湍流摩擦在粘性流体的阻力中起着重要作用&#xff0c;减少湍流摩擦是流体力学领域的热门话题之一。在油气管道的长距离流体输送中&#xff0c;泵站提供的几乎所有动力都用于克服流体的胫骨摩擦。在流体输送领域&#xff0c;船舶的蒙皮摩擦阻力占总…

函数详细解析

目录 形参有默认值的函数 基本概述 指令角度 设定形参默认值 内联函数 基本概述 代码段 函数重载 答疑解惑 形参有默认值的函数 基本概述 从右向左设定形参默认值 形参默认值可以在定义时设定&#xff0c;也可以在声明时设定 每个形参的默认值只能被设定一次 指令角度…

华为HCIP第二节-------------------------ISIS

IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNetwork Protocol&…

1200*B. Vanya and Lanterns

Examples input 7 15 15 5 3 7 9 14 0 output 2.5000000000 input 2 5 2 5 output 2.0000000000 解析&#xff1a; 最大距离即为每相邻两盏灯之间的最大距离/2 注意起点没有灯&#xff0c;终点可能有灯&#xff0c;需要分别判断 #include<bits/stdc.h> using nam…

前端html中让两个或者多个div在一行显示,用style给div加上css样式

文章目录 前言一、怎么让多个div在一行显示 前言 DIV是层叠样式表中的定位技术&#xff0c;全称DIVision&#xff0c;即为划分。有时可以称其为图层。DIV在编程中又叫做整除&#xff0c;即只得商的整数。 DIV元素是用来为HTML&#xff08;标准通用标记语言下的一个应用&#x…