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

2024-01-08 06:14:48

目录

一、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>,该库提供了高精度的时间计算功能,并可以方便地进行时间点和时间间隔的转换。

文章来源:https://blog.csdn.net/m0_62338174/article/details/135437816
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。