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)。

当 ++ 运算符作用于 obj 时,会调用运算符函数 void operator++( ),该函数将数据成员 i 的值增加到 1。

这个程序不完整,因为你无法使用代码

obj1 = ++obj;

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

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


示例 2:前缀增量 ++ 运算符重载(带返回类型)

#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 存储在对象 obj 中。

由于运算符函数的返回类型是 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

当以 C++ 运算符前缀形式重载增量运算符时:调用 Check operator ++ ();但当以 C++ 运算符后缀形式重载增量运算符时:调用 Check operator ++ (int)

请注意括号中的 int。这个 int 向编译器提供信息,表明这是运算符的后缀版本。

不要将这个 int 误认为是整数。


示例 4:Decrement -- 运算符的运算符重载

Decrement 运算符可以以与 increment 运算符类似的方式重载。

#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

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


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战