首页 > 编程语言 >C++ ++ 和 -- 运算符重载

C++ ++ 和 -- 运算符重载

时间:2024-03-03 15:55:52浏览次数:30  
标签:return temp ++ 运算符 -- int 重载 Check

原文

递增运算符( ++ )和递减运算符( -- )是 C++ 语言中两个重要的一元运算符。

1、递增和递减一般是改变对象的状态,所以一般是重载为成员函数。

2、重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指针的递增递减是无法重载的),所以一般情况的递增递减是操作对象内部的成员变量。

3、递增和递减分为前置和后置情况,a = ++b;(前置), a = b++;(后置)。因为符号一样,所以给后置版本加一个int形参作为区分,这个形参是0,但是在函数体中是用不到的,只是为了区分前置后置。例如:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6 // 例如这里的重载递增就是为了增加pos的值
 7 class ca
 8 {
 9 public:    
10     int pos;
11     //前置递增就是增加当前对象的pos的值,并且返回当前对象
12     ca operator++(){
13         pos++;
14         return *this;
15     }
16     //后置递增就是增加当前对象的pos的值,并且返回增加pos之前的该对象
17     ca operator++(int){
18         ca ret = *this;
19         ++*this;        //这个会调用上面的函数,其实这里可以换成pos++;
20         return ret;
21     }
22 };
23 int main()
24 {
25     ca a, b;
26     a.pos = 1;
27     b = a++;
28     cout << "b1:" << b.pos << endl;   // b1:1
29     b = ++a;
30     cout << "b2:" << b.pos << endl;   // b1:3
31     return 0;
32 }

结果

b1:1
b2:3

下面的实例演示了如何重载递增运算符( ++ ),包括前缀和后缀两种用法。

 1 #include <iostream>
 2 using namespace std;
 3 class Time
 4 {
 5    private:
 6       int hours;             // 0 到 23
 7       int minutes;           // 0 到 59
 8    public:
 9       // 所需的构造函数
10       Time(){
11          hours = 0;
12          minutes = 0;
13       }
14       Time(int h, int m){
15          hours = h;
16          minutes = m;
17       }
18       // 显示时间的方法
19       void displayTime()
20       {
21          cout << "H: " << hours << " M:" << minutes <<endl;
22       }
23       // 重载前缀递增运算符( ++ )
24       Time operator++ ()  
25       {
26          ++minutes;          // 对象加 1
27          if(minutes >= 60)  
28          {
29             ++hours;
30             minutes -= 60;
31          }
32          return Time(hours, minutes);
33       }
34       // 重载后缀递增运算符( ++ )
35       Time operator++( int )         
36       {
37          // 保存原始值
38          Time T(hours, minutes);
39          // 对象加 1
40          ++minutes;                    
41          if(minutes >= 60)
42          {
43             ++hours;
44             minutes -= 60;
45          }
46          // 返回旧的原始值
47          return T; 
48       }
49 };
50 int main()
51 {
52    Time T1(11, 59), T2(10,40);
53    ++T1;                    // T1 加 1
54    T1.displayTime();        // 显示 T1
55    ++T1;                    // T1 再加 1
56    T1.displayTime();        // 显示 T1
57    T2++;                    // T2 加 1
58    T2.displayTime();        // 显示 T2
59    T2++;                    // T2 再加 1
60    T2.displayTime();        // 显示 T2
61    return 0;
62 }

结果

H: 12 M:0
H: 12 M:1
H: 10 M:41
H: 10 M:42

注意,int 在 括号内是为了向编译器说明这是一个后缀形式,而不是表示整数

前缀形式重载调用 Check operator ++ () ,后缀形式重载调用 operator ++ (int)。

 1 #include <iostream>
 2 using namespace std;
 3 class Check
 4 {
 5   private:
 6     int i;
 7   public:
 8     Check(): i(0) {  }
 9     Check operator ++ ()
10     {
11         Check temp;
12         temp.i = ++i;
13         return temp;
14     }
15     // 括号中插入 int 表示后缀
16     Check operator ++ (int)
17     {
18         Check temp;
19         temp.i = i++;
20         return temp;
21     }
22     void Display()
23     { cout << "i = "<< i <<endl; }
24 };
25 int main()
26 {
27     Check obj, obj1;    
28     obj.Display(); 
29     obj1.Display();
30     // 调用运算符函数,然后将 obj 的值赋给 obj1
31     obj1 = ++obj;
32     obj.Display();
33     obj1.Display();
34     // 将 obj 赋值给 obj1, 然后再调用运算符函数
35     obj1 = obj++;
36     obj.Display();
37     obj1.Display();
38     return 0;
39 }

结果:

i = 0
i = 0
i = 1
i = 1
i = 2
i = 1

--运算符重载

 

 1 #include <iostream>
 2 using namespace std;
 3 class Check
 4 {
 5   private:
 6     int i;
 7   public:
 8     Check(): i(3) {  }
 9     Check operator -- ()
10     {
11         Check temp;
12         temp.i = --i;
13         return temp;
14     }
15     // 括号中插入 int 表示后缀
16     Check operator -- (int)
17     {
18         Check temp;
19         temp.i = i--;
20         return temp;
21     }
22     void Display()
23     { cout << "i = "<< i <<endl; }
24 };
25 int main()
26 {
27     Check obj, obj1;    
28     obj.Display(); 
29     obj1.Display();
30     // 调用运算符函数,然后将 obj 的值赋给 obj1
31     obj1 = --obj;
32     obj.Display();
33     obj1.Display();
34     // 将 obj 赋值给 obj1, 然后再调用运算符函数
35     obj1 = obj--;
36     obj.Display();
37     obj1.Display();
38     return 0;
39 }

 

结果

i = 3
i = 3
i = 2
i = 2
i = 1
i = 2

 

标签:return,temp,++,运算符,--,int,重载,Check
From: https://www.cnblogs.com/uacs2024/p/18050138

相关文章

  • 杨辉三角形
    杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。下面给出了杨辉三角形的前4行:1111211331给出n,输出它的前n行。输入格式输入包含一个数n。输出格式输出杨辉三角形的前......
  • Windows基础
    NTLM协议LM加密算法  LMHash的明文密码被限制在14位以内。如果LMHash的值为aad3b435b51404eeaad3b435b51404ee,说明LMHasg为空或者被禁用了。加密流程  以P@ss1234来演示LMHash的加密流程:    1)将用户的明文口令转化为大写,并转化为16进制字符串。   ......
  • Go 100 mistakes - #94: Not being aware of data alignment
      ......
  • npm 包 package.json 配置文件
    package.json文件每个前端项目中都有package.json文件,它是用于声明依赖的npm包配置文件。1.生成package.json文件yarninit-y{"name":"package.json文件","version":"1.0.0","main":"index.js","license":......
  • java - 流式编程
    1.获取流的方法://1.从集合转化List<Integer>list=newArrayList<>();Stream<Integer>stream=list.stream();//转化为流stream.Collect(Collectors.toList());//转换为流,流再转回为集合。//2.自定义初始化Stream<Integer>stream=Stream.of(1,5,6,4,8,3,1,9); 2......
  • 知识点
    java.util包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。第一个构造函数使用当前日期和时间来初始化对象。Date();第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。Date(longmillisec);Date对象创建以后,可以调......
  • linux基于clion搭建stm32开发环境
    1.安装开发工具1.1安装stm32cubemx下载地址https://www.st.com/zh/development-tools/stm32cubemx.html1.2安装clion方法1:直接下载clion,下载地址https://www.jetbrains.com/clion/download方法2:通过JetBrainsToolBox下载,JetBrainsToolBox下载地址https://www.j......
  • docker 安装与使用
    docker安装与使用安装ubuntu解决Windows和VMware中的ubuntu22.04两者之间不可以复制、粘贴的问题sudoapt-getautoremoveopen-vm-toolssudoapt-getinstallopen-vm-tools-desktopsudoreboot更新Ubuntusudoaptupdatesudoaptupgradesudoaptfull-upgrade添......
  • Go - Optimization - instruction-level parallelism (ILP)
      ......
  • 当打印服务(Print Spooler)自动关闭
    当打印服务(PrintSpooler)自动关闭时,通常会导致无法正常打印。这个问题可能由多种原因引起,以下是一些可能的分析和解决方案:问题分析:损坏的打印队列文件:打印队列中出现损坏的文件可能导致打印服务关闭。冲突的打印机驱动程序:旧的、损坏或不兼容的打印机驱动程序可能导致打印......