实验六 多态的应用

一、要求

定义Point类,有坐标x,y两个数据成员

分别用成员函数和友元函数实现对Point类重载“+”、“-”、“++”、“《”、“》”(包括前增和后增)运算符,实现对坐标值的改变

二、分析

重载运算符的格式为函数类型 operator 运算符(形参列表)

重载流插入运算符ostream& operator <<(ostream &, 自定义类&)

重载流提取运算符istream &operator>>(istream &, 自定义类&)

流插入<<和流提取>>不能定义类的成员函数,只能作为友元函数

Point operator ++()是前增,可以通过this指针自由访问本类,加上int,Point operator ++(int),变为后增

分析以上概念后,分两个源文重载“+”、“-”、“++”、 “–”,重载“+”、“-”、“++”、 “–”、“《”、“》”。都定义Point类,其中友元函数的定义格式与成员函数略有区别,成员函数比友元函数少写一个参数即*this类本身,友元函数需要自定义参数列表(Point &p0)

三、代码

💻提示:所有实验源码已在github整理

//成员函数对“+”、“-”、“++”、 “--”重载
#include<iostream>
using namespace std;

class Point
{
private:
double x, y;
public:
Point() {};
Point(double x, double y)
{
this->x = x;
this->y = y;
}
void show()
{
cout << "(" << this->x << "," << this->y << ")" << endl;
}
Point operator + (Point &p2)
{
Point p;
p.x =x+ p2.x;
p.y =y+ p2.y;
return p;
}
Point operator - (Point &p2)
{
Point p;
p.x = x - p2.x;
p.y = y - p2.y;
return p;
}
//前增
Point operator ++()
{
//先加
x++;
y++;
//后使用
return *this;
}
//后增
Point operator ++(int)
{
//先使用(备份)
Point temp=*this;
//后加
++(*this);
return temp;
}
//前减
Point operator --()
{
x--;
y--;
return *this;
}
//后减
Point operator --(int)
{
Point temp = *this;
--(*this);
return temp;
}
};

int main()
{
Point p0(1, 1);
Point p1(1, 1);
cout << "p0";
p0.show();
cout << "p1";
p1.show();
cout << "p0+p1=";
Point p2 = p0 + p1;
p2.show();
Point p3 = p1 - p0;
cout << "p1-p0=";
p3.show();
cout << "++p0:";
(++p0).show();
cout << "p0++:";
(p0++).show();
cout << "p0++后p0:";
p0.show();
cout << "--p1:";
(--p1).show();
cout << "p1--:";
(p1--).show();
cout << "p1--后p1:";
p1.show();

system("pause");
return 0;
}

//友元函数对“+”、“-”、“++”、 “--”、“《”、“》”重载
#include<iostream>
using namespace std;

class Point
{
private:
double x, y;
public:

Point() {};
Point(double x, double y)
{
this->x = x;
this->y = y;
}
void show()
{
cout << "(" << this->x << "," << this->y << ")" << endl;
}
friend Point operator + (Point &p1,Point &p2);
friend Point operator - (Point &p1, Point &p2);
friend Point operator ++(Point &p0);
friend Point operator ++(Point &p0,int);
friend Point operator --(Point &p0);
friend Point operator --(Point &p0,int);
friend ostream& operator <<(ostream &out, Point &p0);
friend istream &operator>>(istream &in, Point &p0);
};
Point operator + (Point &p1, Point &p2)
{
Point p;
p.x = p1.x + p2.x;
p.y = p1.y + p2.y;
return p;
}
Point operator - (Point &p1, Point &p2)
{
Point p;
p.x = p1.x - p2.x;
p.y = p1.y - p2.y;
return p;
}
//前增
Point operator ++(Point &p0)
{
//先加
p0.x++;
p0.y++;
//后使用
return p0;
}
//后增
Point operator ++(Point &p0,int)
{
//先使用(备份)
Point temp = p0;
//后加
p0.x++;
p0.y++;
return temp;
}
//前减
Point operator --(Point &p0)
{
p0.x--;
p0.y--;
return p0;
}
//后减
Point operator --(Point &p0,int)
{
Point temp = p0;
p0.x--;
p0.y--;
return temp;
}

ostream &operator <<(ostream &out, Point &p0)
{
out <<"("<< p0.x<<","<<p0.y<<")";
return out;
}
istream &operator>>(istream &in, Point &p0)
{
in >> p0.x >> p0.y;
return in;
}
int main()
{
Point p0;
cout << "输入p0" << endl;
cin >> p0;//提取运算符重载
cout << "p0="<< p0 << endl;//流插入运算符重载

Point p1;
cout << "输入p1" << endl;
cin >> p1;//提取运算符重载
cout << "p1=" << p1 << endl;//流插入运算符重载

Point p3 = p0 + p1;//加法重载
cout << "p3=p0+p1=" << p3 << endl;
Point p4 = p0 - p1;//减法重载
cout << "p4=p0-p1=" << p4 << endl;
cout << "++p0:";//前置++
(++p0).show();
cout << "p0++:";//后置++
(p0++).show();
cout << "p0++后p0:";
p0.show();
cout << "--p1:";//前置--
(--p1).show();
cout << "p1--:";//后置--
(p1--).show();
cout << "p1--后p1:";
p1.show();

system("pause");
return 0;
}

四、 结果

成员函数对“+”、“-”、“++”、 “–”重载

C++实验11

友元函数对“+”、“-”、“++”、 “–”、“《”、“》”重载

C++实验12

其它参考C++前置自增运算符和后置自增运算符的重载 趋之若鹜的博客-CSDN博客_后置自增运算符重载cin和cout重载实现详解_code配上格子衫的博客-CSDN博客_重载cout