【C++】类Point的设计与实现

实验目的

  • 通过实验掌握常见运算符的重载规则。
  • 任务
    • 请编写程序,设计并实现表示二维坐标下的点类 Point(其中封装了float x,y 两个坐标),以完成以下功能:
      1. 按照[x,y]的形式输出一个点对象;
      2. 实现点对象的前++、后++的功能,其中 x 和 y 分别自增;
      3. 实现点对象的加法运算。

源码

Point102.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once    //保证同一个文件不会被编译多次
//#include<iostream>

using namespace std;

class Point102
{
friend ostream& operator<<(ostream& cout, const Point102& point);
//重载ostream类中的<<并友元
friend Point102 operator+(const int& x, const Point102& other);
//双目运算符需要类外重载,常数+x
public:
Point102(float xx = 0, float yy = 0) :x(xx), y(yy) {}
Point102 operator++(); //前置++
Point102 operator++(int); //后置++
Point102 operator+(int xx); //x+常数

private:
float x;
float y;
};

Point102.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include "Point102.h"


ostream& operator<<(ostream& cout, const Point102& point) {
cout << "[" << point.x << "," << point.y << "]";
return cout;
}//重载<<,必须在类外重载,类内友元

Point102 Point102::operator++() {
++x;
++y;
return *this;
}//前置++

Point102 Point102::operator++(int) {
Point102 r(*this);//复制一个出来
++(*this);//这里的++已经被前面重载了
return r;//返回之前复制的
}

Point102 Point102::operator+(int xx) {
return Point102(xx+x,y);//这里return出来了,但并不更改对象
}

Point102 operator+(const int &x,const Point102& other) {
return Point102(x + other.x, other.y);
}//类外定义常数+x,常数在前

PointProject102.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include "Point102.h"

using namespace std;

int main()
{
Point102 a(1, 2), b;//定义对象a和b
cout << a++ << endl;
cout << ++a << endl;

int d = 10;
b = a + d;
cout << a << "+" << d << "=" << b << endl;

b = d + a;
cout << d << "+" << a << "=" << b << endl;
}

总结

  1. 双目运算符为什么要类外重载还不得而知==、
  2. 输入输出运算符必须要类外重载,如果用成员函数重载那么就会变成test<<cout,和习惯不符,且这样就莫得办法连续运算。