C++ 学习笔记之运算符重载+案例

news2024/11/17 17:45:35

目录

一、C++ 运算符重载

二、定义一个成员函数或全局函数

 三、计算时间

1.计算时间差

2.时间加减

四、一个运算符重载实例


一、C++ 运算符重载

是一种特性,它允许程序员重新定义已有的运算符的行为,以适应自定义类型的操作。通过运算符重载,我们可以使用自定义类型的对象进行类似于内置类型的操作,使代码更加直观和易读。

以下是一些常见的 C++ 运算符重载示例:

  1. 算术运算符重载:

    • +:用于两个对象的相加操作。
    • -:用于两个对象的相减操作。
    • *:用于两个对象的相乘操作。
    • /:用于两个对象的相除操作。
  2. 关系运算符重载:

    • ==:用于判断两个对象是否相等。
    • !=:用于判断两个对象是否不相等。
    • <:用于判断一个对象是否小于另一个对象。
    • >:用于判断一个对象是否大于另一个对象。
    • <=:用于判断一个对象是否小于等于另一个对象。
    • >=:用于判断一个对象是否大于等于另一个对象。
  3. 赋值运算符重载:

    • =:用于将一个对象的值赋给另一个对象。
  4. 输入输出运算符重载:

    • <<:用于将对象的值输出到流中。
    • >>:用于从流中读取值并将其赋给对象。
  5. 自增自减运算符重载:

    • ++:用于使对象自增。
    • --:用于使对象自减。
  6. 下标运算符重载:

    • []:用于通过下标访问对象中的元素。

要重载一个运算符,需要在类中定义一个对应的成员函数或全局函数,并使用特殊的命名规则。运算符重载函数通常以关键字 operator 开头,然后是要重载的运算符符号。

例如,要重载加法运算符 +,可以

二、定义一个成员函数或全局函数

// 成员函数形式
class MyClass {
public:
    MyClass operator+(const MyClass& other) {
        // 定义加法操作的实现
    }
};

// 全局函数形式
class MyClass {
    
};

MyClass operator+(const MyClass& obj1, const MyClass& obj2) {
    // 定义加法操作的实现
}

 三、计算时间

计算时间通常包括两个方面:时间差和时间加减。

1.计算时间差

计算时间差可以用于计算两个日期之间的天数、小时数、分钟数等。一种常见的方法是将日期转换为 Unix 时间戳,然后计算时间戳的差值。在 C++ 中,可以使用 <chrono> 头文件中的 system_clock::now() 函数获取当前时间的时间点,再通过 time_since_epoch() 函数获取时间点对应的时间戳。

例如,以下代码计算了两个时间点之间的时间差:

#include <iostream>
#include <chrono>

int main() {
    std::chrono::system_clock::time_point start_time = std::chrono::system_clock::now();
    // 执行一些操作
    std::chrono::system_clock::time_point end_time = std::chrono::system_clock::now();
    std::chrono::duration<double> time_diff = end_time - start_time;
    std::cout << "Time difference: " << time_diff.count() << " seconds" << std::endl;
    return 0;
}

2.时间加减

在 C++ 中,可以使用 <chrono> 头文件中的 time_point 类型表示一个时间点,使用 duration 类型表示时间间隔。要进行时间加减,可以将一个时间点加上一个时间间隔,得到一个新的时间点。例如,以下代码将当前时间加上一小时:

#include <iostream>
#include <chrono>

int main() {
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    std::chrono::hours an_hour(1);
    std::chrono::system_clock::time_point new_time = now + an_hour;
    std::cout << "New time: " << std::chrono::system_clock::to_time_t(new_time) << std::endl;
    return 0;
}

请注意,时间加减操作可能会受到夏令时等因素的影响,因此需要谨慎处理。此外,如果需要更高精度的计算,可以考虑使用第三方库如 Boost 或 Qt 中提供的日期时间类。

四、一个运算符重载实例

用于计算两个时间点之间的时间差:

#include <iostream>
#include <chrono>

class Time {
public:
    Time(int year, int month, int day, int hour, int minute, int second) {
        std::tm time = {0, 0, 0, day, month - 1, year - 1900};
        std::time_t tt = std::mktime(&time);
        tt += hour * 3600 + minute * 60 + second;
        m_time_point = std::chrono::system_clock::from_time_t(tt);
    }

    // 运算符重载:计算时间差
    std::chrono::duration<double> operator-(const Time& other) const {
        return m_time_point - other.m_time_point;
    }

private:
    std::chrono::system_clock::time_point m_time_point;
};

int main() {
    Time t1(2022, 1, 1, 0, 0, 0);
    Time t2(2023, 1, 1, 0, 0, 0);
    std::chrono::duration<double> diff = t2 - t1;
    std::cout << "Time difference: " << diff.count() << " seconds" << std::endl;
    return 0;
}

在上面的代码中,我们定义了一个 Time 类来表示一个时间点。该类包含一个构造函数,用于将日期和时间转换为一个时间点;以及一个运算符重载函数 -,用于计算两个时间点之间的时间差。在主函数中,我们创建了两个时间点,并计算它们之间的时间差。最终输出结果为两个时间点之间相差的秒数。

请注意,上述代码中我们使用了 C++11 标准中新增的日期时间库 <chrono>,该库提供了高精度的时间计算功能,并可以方便地进行时间点和时间间隔的转换。

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

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

相关文章

java内存屏障

参考&#xff1a;https://blog.csdn.net/weixin_73077810/article/details/132804522 内存屏障主要用于解决线程的可见性、有序性问题 代码案例&#xff1a; ReentrantLock保证可见性的原理 在 lock.lock() 和 lock.unlock() 时&#xff0c;都会操作 AbstractQueuedSy…

UEditor在编辑对齐方式时产生额外空行问题

一、问题描述 一个关于UEditor富文本编辑器的问题&#xff1a;在编辑内容对齐方式后保存后浏览器显示的段落上下会比原先多出一些间距。 下面是对齐编辑后&#xff0c;未保存前的的HTML&#xff1a; 保存后&#xff0c;实际会多出一个段落空行&#xff1a; 二、问题调查 经…

Java多线程技术11——ThreadPoolExecutor类的使用1-备份

1 概述 ThreadPoolExecutor类可以非常方便的创建线程池对象&#xff0c;而不需要程序员设计大量的new实例化Thread相关的代码。 2 队列LinkedBlockingQueue的使用 public class Test1 {public static void main(String[] args) {LinkedBlockingQueue queue new LinkedBlocki…

字节跳动基础架构SRE-Copilot获得2023 CCF国际AIOps挑战赛冠军

近日&#xff0c;2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会在北京成功举办&#xff0c;活动吸引了来自互联网、运营商、科研院所、高校、软硬件厂商等领域多名专家学者参与&#xff0c;为智能运维的前沿学术研究、落地生产实践打开了新思路。决赛中&#xff0…

leetcode算法题之记忆化搜索总结

记忆化搜索&#xff0c;可以理解为带备忘录的递归&#xff0c;方便进行剪枝&#xff0c;是一种以空间换时间的策略。 本章目录 1.斐波那契数2.不同路径3.最长递增子序列4.猜数字大小II5.矩阵中的最长递增路径 1.斐波那契数 斐波那契数 class Solution { public://递归int f…

GitEE-GitHub实现加速访问与下载项目

gitee域名&#xff1a;https://gitee.com gitee域名&#xff1a;https://github.com 一、从github导出项目到gitee上面&#xff0c;从而实现加速访问与下载 gitee和github都有同步其他仓库的功能&#xff0c;比如码云上就能直接从github或gitlab中导入&#xff1b; 只需要填…

路由器02_静态路由DHCP

一、静态路由 &#xff11;、静态路由特点 由管理员手工配置&#xff0c;是单向的&#xff0c;缺乏灵活性 &#xff12;、默认路由 默认路由是一种比较特殊静态路由&#xff0c;一般用于末节&#xff08;末梢&#xff09;网络&#xff0c;直接指定目标为任何地方 二、静态…

墨墨智库正式上线:开启您的AI智慧之旅

在这个由数据驱动的时代&#xff0c;AI技术正迅速改变我们的工作和生活方式。有没有想过一个平台可以为您提供所有AI相关资源的便捷访问&#xff1f;这就是「墨墨智库」的使命。我们非常高兴地宣布&#xff0c;经过精心准备和期待&#xff0c;「墨墨智库」现已正式上线&#xf…

深入理解C指针

深入理解C指针 ​#C语言 #​ #C指针 #​ 1 认识指针 指针&#xff1a;一个存放内存地址的变量 1.1 指针和内存 ​​ ‍ 阅读指针声明时候&#xff0c;可以选择倒过来读&#xff0c;会更容易理解。 指针被赋值为NULL时候&#xff0c;会被解释为二进制0. void指针 具有和…

docker 安装elasticsearch、kibana、cerebro

安装步骤 第一步安装 docker 第二步 拉取elasticsearch、kibana、cerebro 镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.2 docker pull docker.elastic.co/kibana/kibana:7.10.2 docker pull lmenezes/cerebro:latest第三步、创建 容器 创建e…

SQL Server从0到1——写shell

xp_cmdshell 查看能否使用xpcmd_shell&#xff1b; select count(*) from master.dbo.sysobjects where xtype x and name xp_cmdshell 直接使用xpcmd_shell执行命令&#xff1a; EXEC master.dbo.xp_cmdshell whoami 发现居然无法使用 查看是否存在xp_cmdshell: EXEC…

深入理解计算机系统(1):开始

计算机系统是由硬件和系统软件组成的&#xff0c;它们共同工作来运行应用程序。虽然系统的具体实现方式随着时间不断变化&#xff0c;但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件&#xff0c;它们又执行着相似的功能。 计算机系统 信息就是位上下…

❀记忆冒泡、选择和插入排序算法思想在bash里运用❀

目录 冒泡排序算法:) 选择排序算法:) 插入排序算法:) 冒泡排序算法:) 思想&#xff1a;依次比较相邻两个元素&#xff0c;重复的进行直到没有相邻元素需要交换&#xff0c;排序完成。 #!/bin/bash arr(12 324 543 213 65 64 1 3 45) #定义一个数组 n${#arr[*]} #获取数组…

非工程师指南: 训练 LLaMA 2 聊天机器人

引言 本教程将向你展示在不编写一行代码的情况下&#xff0c;如何构建自己的开源 ChatGPT&#xff0c;这样人人都能构建自己的聊天模型。我们将以 LLaMA 2 基础模型为例&#xff0c;在开源指令数据集上针对聊天场景对其进行微调&#xff0c;并将微调后的模型部署到一个可分享的…

【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

00. 目录 文章目录 00. 目录01. 定时器中断相关API1.1 TIM_InternalClockConfig1.2 TIM_TimeBaseInit1.3 TIM_TimeBaseInitTypeDef1.4 TIM_ClearFlag1.5 TIM_ITConfig1.6 TIM_Cmd1.7 中断服务函数1.8 TIM_ETRClockMode2Config 02. 定时器定时中断接线图03. 定时器定时中断示例0…

每日算法打卡:数的范围 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码 原题链接 789. 数的范围 题目难度&#xff1a;简单 题目描述 给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q 个查询。 对于每个查询&#…

数字孪生在虚拟现实(VR)中的应用

数字孪生在虚拟现实&#xff08;VR&#xff09;中的应用为用户提供了更深入、沉浸式的体验&#xff0c;同时通过数字孪生技术模拟真实世界的物理实体。以下是数字孪生在VR中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

12月笔记

#pragma once 防止多次引用头文件&#xff0c;保证同一个&#xff08;物理意义上&#xff09;文件被多次包含&#xff0c;内容相同的两个文件同样会被包含。 头文件.h与无.h的文件&#xff1a; iostream是C的头文件&#xff0c;iostream.h是C的头文件&#xff0c;即标准的C头文…

电话号码信息收集工具:PhoneInfoga | 开源日报 No.137

sundowndev/phoneinfoga Stars: 11.2k License: GPL-3.0 PhoneInfoga 是一个用于扫描国际电话号码的信息收集框架&#xff0c;它允许用户首先收集基本信息 (如国家、地区、运营商和线路类型)&#xff0c;然后使用各种技术来尝试找到 VoIP 提供商或识别所有者。该工具与一系列必…

[MySQL]视图索引以及连接查询案列

目录 1.视图 1.1视图是什么 1.2视图的作用 1.3操作 1.3.1创建视图 1.3.2视图的修改 1.3.3删除视图 1.3.4查看视图 2.索引 2.1什么是索引 2.2为什么要使用索引 2.3索引的优缺点 2.3.1优点 2.3.2缺点 2.4索引的分类 3.连接查询案列 4.思维导图 1.视图 1.1视图是什么 视图…