题目描述
定义一个三维点Point类,利用友元函数重载"++“和”–"运算符,并区分这两种运算符的前置和后置运算。 要求如下:
1.实现Point类;
2.编写main函数,初始化1个Point对象,将这个对象++或–后赋给另外一个对象,并输出计算后对象的坐标信息。 输入 第1行:输入三个int类型的值,分别为一个Point对象p1的x,y,z坐标。输出
第1行:Point对象p1后置++之后的坐标信息输出。
第2行:Point对象p1后置++操作后赋给另外一个Point对象p2的坐标信息。
第3行开始,依次输出前置++,后置–,前置–运算的坐标信息,输出格式与后置++一样。
样例输入
10 20 30
样例输出
x=11 y=21 z=31
x=10 y=20 z=30
x=11 y=21 z=31
x=11 y=21 z=31
x=9 y=19 z=29
x=10 y=20 z=30
x=9 y=19 z=29
x=9 y=19 z=29
提示
原值是最初输入的数值第1行是p1后置++后,再输出
第2行是p1恢复原值,接着p1后置++同时复制给p2,p2输出
第3、4行是p1恢复原值,p1前置++同时输出,然后p1再输出
第5、6行是p1恢复原值,p1后置–后,再输出,接着输出一次原值
第7、8行是p1恢复原值,p1前置–同时输出,然后p1再输出
#include<iostream>
#include<cmath>
#include <cstring>
using namespace std;
class Point{
int x;
int y;
int z;
public:
Point(int X=0,int Y=0,int Z=0)
{x=X;y=Y;z=Z;}
Point(Point &a){
x=a.x;
y=a.y;
z=a.z;
}
void set(int X,int Y,int Z){
x=X;y=Y;z=Z;
}
friend Point& operator++(Point &);
friend Point operator++(Point &,int);
friend Point& operator--(Point &);
friend Point operator--(Point &,int);
void show(){
cout<<"x="<<x<<' '<<"y="<<y<<' '<<"z="<<z<<endl;
}
};
Point &operator++(Point &a){ //前置++,是先加加,在使用
a.x++;
a.y++;
a.z++;
return a;
}
Point operator++(Point &a,int){ //先使用,后加加
Point temp(a);
a.x++;
a.y++;
a.z++;
return temp;
}
Point& operator--(Point &a){
a.x--;
a.y--;
a.z--;
return a;
}
Point operator--(Point &a,int){
Point temp(a);
a.x--;
a.y--;
a.z--;
return temp;
}
int main(){
int x,y,z;
cin>>x>>y>>z;
Point p1(x,y,z);
Point p2;
p1++;
p1.show(); //第1行是p1后置++后,再输出
p1.set(x,y,z);
p2=p1++;
p2.show(); //第2行是p1恢复原值,接着p1后置++同时复制给p2,p2输出
p1.set(x,y,z);
(++p1).show();
p1.show(); //第3、4行是p1恢复原值,p1前置++同时输出,然后p1再输出
p1.set(x,y,z);
p1--;
p1.show();
p1.set(x,y,z);
p1.show(); //第5、6行是p1恢复原值,p1后置--后,再输出,接着输出一次原值
(--p1).show();
p1.show(); //第7、8行是p1恢复原值,p1前置--同时输出,然后p1再输出
}
前置++与后置++的区别
1、前置返回的是引用,后置返回的是临时对象。因为后置的时候原来的对象已经被++改变了。前置用引用则是为了不产生临时变量,可以减少内存的消耗。
2、后置的函数的声明里面参数列表中比前置多了一个int,这里的int其实是作为区分前后置的标志,在函数体里面并没有直接地用到。