首先是类的声明头文件:
在类的声明中,分别用了四个函数实现重载的不同方式,已标注,程序可和类定义中的相应函数配合实现相应的重载功能。
/******************************Integer.h***********************************/
#ifndef _INTEGER_H_
#define _INTEGER_H_
class Integer{
public:
Integer() = default; //执行默认
Integer(int);
~Integer() = default;
void display()const;
/************************前置++运算符**************************/
//Integer& operator++(); //成员函数重载
//friend Integer& operator++(Integer&); //友元函数重载
/************************后置++运算符**************************/
//Integer operator++(int); //成员函数重载,规定:后置++重载时,为和前置++区分,参数须写上int,或int val(变量名不固定)
friend Integer operator++(Integer&, int); //友元函数重载
private:
int m_nValue;
};
#endif
其次是类的定义,同样为配合上面的定义,具有四个函数的定义。
#include "integer.h"
#include <iostream>
Integer::Integer(int nValue)
:m_nValue(nValue)
{
}
void Integer::display()const
{
std::cout << m_nValue << std::endl;
}
#if 0
//前置++的成员函数重载,不含参数,因为这种方式默认含有对象自己
Integer& Integer::operator++()
{
m_nValue++;
return *this;
}
//前置++的友元函数重载
Integer& operator++(Integer& obj)
{
obj.m_nValue++;
return obj;
}
//后置++的成员函数重载,在重载后置++时,规定:为了区分它和前置++,参数须写上int,或者int val(val变量名自由定义)。
Integer Integer::operator++(int)
{
Integer temp;
temp.m_nValue = m_nValue++;
return temp;
}
#endif
//后置++的友元函数重载,参数为int
Integer operator++(Integer& obj, int)
{
Integer temp(obj.m_nValue);
obj.m_nValue++;
return temp;
}
其次,前置++和后置++的主要区别在于:前置++执行该命令=时变量立即+1,而后置++在执行完该条语句后才+1。所以后置++需要一个临时变量,将初值保存起来,在表达式中发挥相应的作用。
下面是测试程序:
#include "integer.h"
int main(int argc, char *argv[])
{
Integer n1(10);
n1.display();
Integer n2 = ++n1;
n2.display();
n1.display():
Integer n3 = n1++;
n3.display();
n1.display();
return 0;
}