在 C++ 中重载自增符号 ++ 和自减符号 --

要理解此示例,您应该具备以下 C++ 编程 主题的知识:

在本教程中,递增 ++ 和递减 -- 运算符以最佳方式重载,比,如果对一个对象使用 ++ 运算符,则将对象的数据成员的值增加 1,如果使用 -- 运算符,则将对象的数据成员的值减少 1。

示例 1:无返回类型的前缀 ++ 自增运算符重载

#include <iostream>
using namespace std;

class Check
{
    private:
       int i;
    public:
       Check(): i(0) {  }
       void operator ++()
          { ++i; }
       void Display()
          { cout << "i=" << i << endl; }
};

int main()
{
    Check obj;

    // Displays the value of data member i for object obj
    obj.Display();

    // Invokes operator function void operator ++( )
    ++obj;

    // Displays the value of data member i for object obj
    obj.Display();

    return 0;
}

输出

i=0
i=1

当对象 obj 被声明时,对象 obj 的数据成员的值 i 是 0(构造函数初始化 i 为 0)。

++ 运算符作用在对象上时, 调用操作符函数 void operator++( ),增加数据成员的值 i 到 1。

这个程序不完整,你不能使用代码:

obj1 = ++obj;

这是因为上面程序中操作符函数的返回类型是 void。

以下程序是对上述程序的小修改,以便您可以使用代码 obj1 = ++obj

示例 2:带返回类型的 Prefix Increment ++ 运算符重载

#include <iostream>
using namespace std;

class Check
{
  private:
    int i;
  public:
    Check(): i(0) {  }

    // Return type is Check
    Check operator ++()
    {
       Check temp;
       ++i;
       temp.i = i;

       return temp;
    }

    void Display()
    { cout << "i = " << i << endl; }
};

int main()
{
    Check obj, obj1;
    obj.Display();
    obj1.Display();

    obj1 = ++obj;

    obj.Display();
    obj1.Display();

    return 0;
}

输出

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

这个程序类似于上面的程序。

唯一不同的是,运算符函数的返回类型是 Check。 在这种情况下,它允许使用两种代码 ++obj; obj1 = ++obj; 。这是因为, 从运算符函数返回的 temp 存储在对象中.

因为,运算符函数的返回类型是 Check,你也可以赋值 obj 到另一个对象。

请注意,=(赋值运算符)不需要重载,因为该运算符已在 C++ 库中重载。

示例 3:后缀自增 ++ 运算符重载

直到此时,自增运算符的重载仅在以前缀形式使用时才能工作。

这是对上述程序的修改,使其适用于前缀形式和后缀形式。

#include <iostream>
using namespace std;

class Check
{
  private:
    int i;
  public:
    Check(): i(0) {  }
    Check operator ++ ()
    {
        Check temp;
        temp.i = ++i;
        return temp;
    }

    // Notice int inside barcket which indicates postfix increment.
    Check operator ++ (int)
    {
        Check temp;
        temp.i = i++;
        return temp;
    }

    void Display()
    { cout << "i = "<< i <<endl; }
};

int main()
{
    Check obj, obj1;
    obj.Display();
    obj1.Display();

    // Operator function is called, only then value of obj is assigned to obj1
    obj1 = ++obj;
    obj.Display();
    obj1.Display();

    // Assigns value of obj to obj1, only then operator function is called.
    obj1 = obj++;
    obj.Display();
    obj1.Display();

    return 0;
}

输出

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

当自增运算符以前缀形式重载时; Check operator ++ () 被调用。但是,当自增运算符以后缀形式重载时, Check operator ++ (int) 被调用。

请注意括号内的 int。这 int 向编译器提供它是运算符的后缀版本的信息。

请注意 int 不表示整数。

示例 4:自减的运算符重载——运算符

自减运算符可以以与自增运算符类似的方式重载。

#include <iostream>
using namespace std;

class Check
{
  private:
    int i;
  public:
    Check(): i(3) {  }
    Check operator -- ()
    {
        Check temp;
        temp.i = --i;
        return temp;
    }

    // Notice int inside barcket which indicates postfix decrement.
    Check operator -- (int)
    {
        Check temp;
        temp.i = i--;
        return temp;
    }

    void Display()
    { cout << "i = "<< i <<endl; }
};

int main()
{
    Check obj, obj1;
    obj.Display();
    obj1.Display();

    // Operator function is called, only then value of obj is assigned to obj1
    obj1 = --obj;
    obj.Display();
    obj1.Display();

    // Assigns value of obj to obj1, only then operator function is called.
    obj1 = obj--;
    obj.Display();
    obj1.Display();

    return 0;
}

输出

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

此外,一元运算符如:!, ~ 等可以以类似的方式重载。