关于运算符重载需要注意的点

运算符重载的语法规则

返回值类型 operator运算符(操作数1,操作数2...)

运算符的操作数有几个,则参数列表有几个参数,对应顺序依次是左操作数,右操作数

当重载了对应运算符时,编译器在识别到对应参数的运算符操作则会对应替换为重载的函数调用

运算符重载的意义

自定义的运算符一般用于适配自定义类型,使代码可读性提高,如实现Date类型的加减等,如下实现一个简化的Date类型加法例子:

#include <iostream>
using namespace std;

class Date {
public:
    Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}

    // 重载 + 运算符,返回一个日期加上指定天数后的新日期
    Date operator+(int days) const {
        Date result = *this;
        result.day_ += days;
        // 处理月份和年份的进位
        while (result.day_ > daysInMonth(result.year_, result.month_)) {
            result.day_ -= daysInMonth(result.year_, result.month_);
            result.month_++;
            if (result.month_ > 12) {
                result.month_ = 1;
                result.year_++;
            }
        }
        return result;
    }

    void display() const {
        cout << year_ << "-" << month_ << "-" << day_ << endl;
    }

private:
    int year_;
    int month_;
    int day_;

    // 获取指定年份和月份的天数
    int daysInMonth(int year, int month) const {
        // 简化处理,假设每个月都有30天
        return 30;
    }
};

int main() {
    Date date1(2024, 2, 20);
    Date date2 = date1 + 10; // 日期加上10天
    date2.display();

    return 0;
}

可重载的运算符

C++中大多运算符都可以进行重载,不可重载的运算符包括成员访问运算符 .、域运算符 ::、长度运算符 sizeof 等

tips:

  • 不能通过连接C++/C里没有的符号来创建新的操作符如operator@()

  • 不能改变内置类型的运算符的含义(如+重载成减法含义)

  • 重载操作符必须有一个自定义类的类型,因为重载操作符的语法就是为了自定义类型而生(如:不能重载两个int类型相加)

  • 作为类成员函数重载时,形参隐含了this

  • 运算符重载与函数重载没有关系,运算符重载只是使同一个运算符可以拥有更多的功能特性

  • 重载前置++和后置++时,c++规定后置++的参数默认加上int进行占位,编译器在遇到后置++时会自动传参

  • 重载流运算符时,应使用全局函数,因为如果作为类内成员函数重载,默认会带有一个“this”的参数

ostream& operator<<(ostream& os, const YourClass& obj);

ps: operator new/operator delete非运算符重载,关于new和delete: new和delete简介

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c.Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值