在 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
此外,一元运算符如:!
, ~
等可以以类似的方式重载。