C++中递增运算符重载的实现示例

 更新时间:2026年02月03日 09:18:29   作者:挖矿大亨  
在C++中,递增运算符分为前置递增和后置递增,重载方式也有明显区别,本文就来详细的介绍一下C++中递增运算符重载的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 C++ 中,递增运算符(++) 分为前置递增(++obj) 和后置递增(obj++),两者语义不同,重载方式也有明显区别。递增运算符是单目运算符,通常重载为类的成员函数(更符合语义,因为操作数是类对象本身),也可重载为全局函数(极少用)。

一、核心区别:前置 vs 后置递增

二、重载语法(成员函数方式,推荐)

  1. 前置递增重载
// 类内声明
类名& operator++();

// 类外定义
类名& 类名::operator++() {
    // 1. 修改对象内部状态(如数值+1)
    // 2. 返回自身引用(*this)
    return *this;
}
  1. 后置递增重载
// 类内声明(int是占位符,无实际意义,仅用于区分前置)
类名 operator++(int);

// 类外定义
类名 类名::operator++(int) {
    // 1. 保存当前对象的副本(临时对象)
    类名 temp = *this;
    // 2. 修改原对象状态
    // 3. 返回副本(原状态)
    return temp;
}

三、基础示例:整数包装类重载 ++

以自定义整数类 MyInt 为例,实现前置 / 后置递增:

#include <iostream>
using namespace std;

class MyInt {
private:
    int val; // 封装的整数值
public:
    // 构造函数
    MyInt(int v = 0) : val(v) {}

    // 1. 重载前置递增(返回引用)
    MyInt& operator++() {
        val++; // 先加1
        return *this; // 返回自身,支持链式操作
    }

    // 2. 重载后置递增(int占位符,返回值)
    MyInt operator++(int) {
        MyInt temp = *this; // 保存当前值
        val++; // 后加1
        return temp; // 返回原状态
    }

    // 辅助:输出重载(方便打印)
    friend ostream& operator<<(ostream& os, const MyInt& mi) {
        os << mi.val;
        return os;
    }
};

int main() {
    MyInt a(5);

    // 前置递增:先加1,再使用
    cout << "++a = " << ++a << endl; // 输出:++a = 6
    cout << "a = " << a << endl;     // 输出:a = 6

    // 后置递增:先使用,再加1
    cout << "a++ = " << a++ << endl; // 输出:a++ = 6
    cout << "a = " << a << endl;     // 输出:a = 7

    // 前置支持链式操作
    MyInt b(10);
    cout << "++(++b) = " << ++(++b) << endl; // 输出:++(++b) = 12

    return 0;
}

四、进阶示例:复数类递增(实部 + 虚部同时 + 1)

#include <iostream>
using namespace std;

class Complex {
private:
    double real; // 实部
    double imag; // 虚部
public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}

    // 前置递增:实部、虚部都+1,返回引用
    Complex& operator++() {
        real++;
        imag++;
        return *this;
    }

    // 后置递增:返回原状态,再修改
    Complex operator++(int) {
        Complex temp = *this;
        real++;
        imag++;
        return temp;
    }

    // 输出重载
    friend ostream& operator<<(ostream& os, const Complex& c) {
        os << real << " + " << imag << "i";
        return os;
    }
};

int main() {
    Complex c(1.5, 2.5);

    cout << "++c = " << ++c << endl;  // 输出:++c = 2.5 + 3.5i
    cout << "c++ = " << c++ << endl;  // 输出:c++ = 2.5 + 3.5i
    cout << "c = " << c << endl;      // 输出:c = 3.5 + 4.5i

    return 0;
}

五、全局函数重载(极少用,了解即可)

若需重载为全局函数(需访问私有成员时声明为友元),语法如下:

#include <iostream>
using namespace std;

class MyInt {
private:
    int val;
public:
    MyInt(int v = 0) : val(v) {}

    // 声明友元:前置递增
    friend MyInt& operator++(MyInt& mi);
    // 声明友元:后置递增
    friend MyInt operator++(MyInt& mi, int);

    friend ostream& operator<<(ostream& os, const MyInt& mi) {
        os << mi.val;
        return os;
    }
};

// 全局定义前置递增
MyInt& operator++(MyInt& mi) {
    mi.val++;
    return mi;
}

// 全局定义后置递增
MyInt operator++(MyInt& mi, int) {
    MyInt temp = mi;
    mi.val++;
    return temp;
}

int main() {
    MyInt a(5);
    cout << ++a << endl; // 6
    cout << a++ << endl; // 6
    cout << a << endl;   // 7
    return 0;
}

六、常见误区与注意事项

1、后置递增的 int 占位符:
这个 int 只是语法标记,无实际参数传递,不能省略(否则编译器无法区分前置 / 后置);
无需给 int 命名(如 operator++(int) 即可,不用写 operator++(int flag))。
2、返回值错误:
前置递增必须返回引用(MyInt&):若返回值,会生成临时对象,链式操作(++(++a))会修改临时对象,而非原对象;
后置递增必须返回值(MyInt):若返回引用,会返回临时对象的引用(临时对象销毁后,引用悬空,导致未定义行为)。
3、修改原对象的语义:
递增运算符的核心是 “修改对象自身”,因此优先重载为成员函数(全局函数需传引用,语义不如成员函数直观)。
与 += 配合:若类已有 += 重载,可复用逻辑:

MyInt& operator++() {
    *this += 1; // 复用 += 逻辑
    return *this;
}

七、递减运算符(–)重载

递减运算符(–)的重载逻辑与递增完全一致,仅需将 “+1” 改为 “-1”:

// 前置递减
MyInt& operator--() {
    val--;
    return *this;
}

// 后置递减
MyInt operator--(int) {
    MyInt temp = *this;
    val--;
    return temp;
}

总结

递增运算符重载分前置和后置,核心区别是返回值类型和执行顺序;
优先重载为成员函数,前置返回引用(支持链式),后置返回值(带 int 占位符);
遵循 “前置先改后返,后置先返后改” 的语义,符合用户对 ++ 的直觉;
递减运算符重载逻辑与递增完全一致,仅修改数值操作。

到此这篇关于C++中递增运算符重载的实现示例的文章就介绍到这了,更多相关C++ 递增运算符重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C语言获取消耗内存的方法

    C语言获取消耗内存的方法

    这篇文章主要介绍了C语言获取消耗内存的方法,涉及C语言中malloc方法的使用技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • C++结构体作为函数参数传参的实例代码

    C++结构体作为函数参数传参的实例代码

    这篇文章主要介绍了C++结构体作为函数参数传参的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 基于OpenCV实现的人脸签到系统源代码

    基于OpenCV实现的人脸签到系统源代码

    本文从实际背景和需求出发,采用人脸识别签到考勤改变了传统人工检验的做法,极大提高了组织效率和办事能力,这篇文章主要给大家介绍了关于如何基于OpenCV实现的人脸签到系统的相关资料,需要的朋友可以参考下
    2024-04-04
  • C语言实现打印数字金字塔

    C语言实现打印数字金字塔

    这篇文章主要介绍了C语言实现打印数字金字塔方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 深入理解C++内联函数

    深入理解C++内联函数

    这篇文章主要为大家介绍了C++内联函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C++类与对象的详细说明2

    C++类与对象的详细说明2

    这篇文章主要为大家详细介绍了C++的类与对象,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++中的作用域案例详解

    C++中的作用域案例详解

    作用域规定了标识符在代码中的可见性和可访问性,全局作用域中的标识符可以在整个程序中使用,局部作用域中的标识符只能在其所在的代码块中使用,而命名空间作用域提供了一种组织和封装代码的方式,以避免命名冲突,这篇文章主要介绍了C++中的作用域,需要的朋友可以参考下
    2024-02-02
  • 基于C语言实现学生管理系统

    基于C语言实现学生管理系统

    这篇文章主要为大家详细介绍了基于C语言实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 举例说明自定义C++异常处理的实例

    举例说明自定义C++异常处理的实例

    这篇文章主要介绍了举例说明自定义C++异常处理的实例的相关资料,这里举例说明该如何使用C++ 的异常,需要的朋友可以参考下
    2017-10-10
  • C++实现LeetCode(160.求两个链表的交点)

    C++实现LeetCode(160.求两个链表的交点)

    这篇文章主要介绍了C++实现LeetCode(160.求两个链表的交点),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论