首页 > 其他分享 >`operator++(int)` 和 `operator++()`

`operator++(int)` 和 `operator++()`

时间:2024-09-27 21:14:20浏览次数:5  
标签:自增 ++ 前置 运算符 int operator

operator++(int)operator++() 是 C++ 中重载的两个不同的自增运算符函数,它们分别用于后置自增前置自增。它们的区别在于调用方式以及自增行为的不同。

1. 前置自增运算符 operator++()

  • 函数签名: Type& operator++();
  • 调用方式: ++object;
  • 作用: 前置自增运算符首先将对象自增,然后返回自增后的对象本身(通常返回为引用类型,Type&),因此你可以直接在同一个表达式中使用自增后的值。
  • 特点: 前置自增更高效,因为它不需要创建临时对象。

2. 后置自增运算符 operator++(int)

  • 函数签名: Type operator++(int);
  • 调用方式: object++;
  • 作用: 后置自增运算符会先返回对象的原始状态,然后再进行自增。参数 int 并不是用来传递值的,它只是用来区分后置和前置运算符,因此它不需要实际传递参数。
  • 特点: 后置自增通常会创建一个临时对象,保存自增前的值,然后再返回这个临时对象。这使得后置自增比前置自增稍微低效一些,因为涉及到对象的拷贝。

具体的示例代码:

#include <iostream>

class Counter {
private:
    int value;
public:
    Counter(int v) : value(v) {}

    // 前置自增运算符
    Counter& operator++() {
        ++value;  // 先自增
        return *this;  // 返回自增后的对象
    }

    // 后置自增运算符
    Counter operator++(int) {
        Counter temp = *this;  // 保存当前状态
        ++value;  // 自增
        return temp;  // 返回自增前的对象
    }

    int getValue() const {
        return value;
    }
};

int main() {
    Counter c(5);

    // 前置自增
    ++c;  // 先自增,再返回
    std::cout << "After ++c: " << c.getValue() << std::endl;  // 输出6

    // 后置自增
    c++;  // 先返回,再自增
    std::cout << "After c++: " << c.getValue() << std::endl;  // 输出7

    return 0;
}

解释:

  1. 前置自增 (++c):

    • 首先调用 operator++(),该函数立即将 value 自增,然后返回自增后的对象引用。因此,输出显示的是自增后的值。
  2. 后置自增 (c++):

    • 调用 operator++(int) 时,先创建一个临时对象 temp,保存自增前的状态,然后将 value 自增,最后返回自增前的那个临时对象。这就是为什么 c++ 操作返回的是自增前的值。

区别总结:

  • 前置自增 (operator++()): 先自增再返回,通常更高效,尤其是对于复杂对象。
  • 后置自增 (operator++(int)): 先返回原始值,再自增,需要创建临时对象,因此稍微低效。

标签:自增,++,前置,运算符,int,operator
From: https://www.cnblogs.com/niumachen/p/18436560

相关文章

  • 【基础岛·第6关】OpenCompass 评测 InternLM-1.8B 实践
    目录1.概览2.环境配置2.1创建开发机和conda环境2.2安装——面向GPU的环境安装3.数据准备3.1评测数据集3.2InternLM和ceval相关的配置文件4.启动测评4.1使用命令行配置参数法进行评测4.2使用配置文件修改参数法进行评测1.概览在OpenCompass中评估一个模型通常包括......
  • C++线程同步之条件变量
    条件变量需要和互斥量配合起来使用,C++11提供了两种条件变量:condition_variable:需要配合std::unique_lockstd::mutex进行wait操作,也就是阻塞线程的操作。condition_variable_any:可以和任意带有lock()、unlock()语义的mutex搭配使用,也就是说有四种:std::mutex:独占的非递归互斥锁......
  • 【Moveit2】move_group_interface_tutorial中文注释
    move_group_interface_tutorial#include<moveit/move_group_interface/move_group_interface.h>//包含MoveIt的移动组接口#include<moveit/planning_scene_interface/planning_scene_interface.h>//包含规划场景接口#include<moveit_msgs/msg/display_robot_stat......
  • 算法速通-90题(1—完数难题)[含pyhton,java,c++]
    题目:完数难题 题目描述如下:    小明正在进行期末数学考试,现在他遇到了这样一个题:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数   比如6,28都是完数:6=1+2+3 ; 28=1+2+4+7+14。请判断两个正整数之间完数的个数。小明想请聪明的你帮......
  • 广州C++信奥老师解一本通题 1919:【02NOIP普及组】选数
    ​ 【题目描述】已知nn个整数x1,x2,……xn以及一个整数K(K<n)。从n个整数中任选K个整数相加,可分别得到一系列的和。例如当n=4, k=34个整数分别为3,7,12,193,7,12,19时,可得全部的组合与它们的和为:3+7+12=223+7+19=297+12+19=383+12+19=34现在,要求你计......
  • C++ 智能指针详解: std::unique_ptr 和 std::shared_ptr
    C++11引入了智能指针,它们是管理动态分配内存的强大工具。本文将详细介绍两种最常用的智能指针:std::unique_ptr和std::shared_ptr。std::unique_ptr概述std::unique_ptr是一种独占所有权的智能指针。它确保一个对象只能被一个unique_ptr所拥有,这意味着不能复制unique_......
  • C++17 std::variant 详解:概念、用法和实现细节
    std::variant是C++17引入的一个新的标准库类型,它提供了一种类型安全的联合体。这个类可以在同一时间持有几种可能类型中的一个值。本文将详细介绍std::variant的概念、用法和实现细节。1.基本概念std::variant是一个模板类,可以存储几种不同类型中的一个值。它的声明如下:te......
  • C++离线查询
    前言C++算法与数据结构打开打包代码的方法兼述单元测试概念及原理离线算法(offlinealgorithms),离线计算就是在计算开始前已知所有输入数据,输入数据不会产生变化,且在解决一个问题后就要立即得出结果的前提下进行的计算。通俗的说:离线查询:问完所有问题后,依次回答。可......
  • 命令行gcc -v和g++ -v输出版本不一致
    命令行gcc-v和g++-v输出版本不一致前言:本文初编辑于2024年1月30日CSDN主页:https://blog.csdn.net/rvdgdsva博客园主页:https://www.cnblogs.com/hassle赞美大萌神,神不允许报错,这世上就没有了bug本人错误描述:conda环境里面有一个默认环境base和一个创建的环境your_env_nam......
  • 电脑字体管理器 PrintMyFonts v24.8.31 免费便携版
    电脑上的字体越来越多,设计时总是找不到合适的字体?使用的软件又不能很好地展示这些字体?这时候,PrintMyFonts就能派上用场,帮助你快速找到理想的字体!PrintMyFonts是一款跨平台的字体管理工具,支持Windows、macOS和Linux系统。它能列出所有已安装的字体,甚至可以显示你自定义的句子或......