面向对象的程序设计-8-运算符重载-part2

/*分为前缀++i和--i和后缀方式i++和i--
一元: 成员函数的重载:a.operator ++()
  友元函数重载: operator ++(X&a)
  后缀方式:i++,i--;
二元: 成员函数重载: a.operator ++(int)
  友元函数重载: operator ++(X&a,int)
 第二个参数一般设置为0。例如i++等价于i++(0)*/
#include <iostream>
using namespace std;
class y
{
public:
y(int i=0,int j=0,int k=0){value1=i;value2=j;value3=k;}
void display() const
{cout<<value1<<","<<value2<<","<<value3<<endl;}
friend y operator ++(y&a,int);//后缀方式,友元方式来实现
//y operator ++(int);//后缀方式,成员函数形式实现a++
friend y operator ++(y&a);//前缀方式,友元函数实现
//y operator ++();//前缀方式,成员函数实现
/*y operator --(int);*/
private:
int value1,value2,value3;
};
//y::y(int i,int j,int k)
//{value1=i;value2=j;value3=k;}
y operator ++(y&a,int)//友元函数,实现后缀
{
a.value1++;a.value2++;a.value3++;
return a;//假设没有返回值的时候???
/*return y();*/
}
//y y::operator ++(int)//成员函数,实现后缀
//{
// value1++;value2++;value3++;//应该是需要个返回值的??
// return *this;//返回的是this指针
//}
y operator ++(y&a)//友元,前缀
{
++a.value1;++a.value2;++a.value3;
return a;
}
//y y::operator++()//成员函数,前缀
//{
// ++value1;++value2;++value3;
// return *this;
//}


void main()
{
y y1(1,2,3);
/*y1(1,2,3);*/
++y1;y1.display();
y1++;y1.display();/*为什么隐式调用无法实现,需要注意什么??
 .后来发现是因为定义了友元函数的形式和成员函数的
 形式,在使用隐式的时候会出现歧义,分不清楚
 所以,本文采用两种方式(友元和成员函数的形式定义
 仅仅是为了说明使用方法)*/
/*使用友元函数进行,引用对象的传值,对于形参对象的所有修改,都无法传到函数体外,
不会影响被调用的对象
*/
operator++(y1,0);y1.display();//友元函数,显式调用,意为y1++
operator++(y1);y1.display();//友元函数,实现后缀。显式调用,++y1
//y1.operator++(0);y1.display();//成员函数,实现后缀。显式调用,y1++
//y1.operator++();y1.display();//成员函数,实现前缀。显式调用,++y1

}

讨论:

重载运算符++之后,可以使用两种方式来调用:

a++;显式地调用

a.operator ++(0);隐式地调用;

对于成员函数和友元函数,仅仅是参数列表上略有不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值