在本教程中,增量 ++ 和减量 -- 运算符以最佳方式重载,即,当 ++ 运算符作用于对象时,将数据成员的值增加 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
此外,一元运算符如:!、~ 等也可以以类似的方式重载。
另请阅读