这里贴上我们讨论了几天的Point类的最终版
Point.h
#ifndef _Point_h
#define _Point_h
#include <string>
class Point {
public:
/*
*构造函数:Point();
*用法:Point p
* Point pt(xc,yc)
*
*创建一个Point类的对象,默认构造函数将默认初始的坐标为(0,0)
*第二种形式是用户自行确定x,y的取值
*/
Point();
Point(int xc, int yc);
/*
*方法:getX,getY
*用法: int x = pt.getX()
* int y = pt.getY()
*
*用途: 返回Point类中的,x 与 y的值
*/
int getX();
int getY();
/*
*方法:toString
*用法:string str = pt.tostring()
*
*用途: 以“(x,y)”形式返回Point的字符串表示形式。
*/
std::string toString();
/*这个接口存放着类内不希望用户看到的功能和私有部分 */
#include "pointpriv.h"
};
/*
*运算符:<<
*用法:cout << pt
*
*用途:重载运算符,使得其能按要求输出
*/
std::ostream & operator<<(std::ostream & os, Point pt);
/*
*运算符:==
*用法:if(pt1 == pt2) .....
*
*用途:判断两个point类对象是不是相等
*/
bool operator==(Point p1, Point p2);
/*
*运算符:!=
*用法:if(pt1 != pt2) .....
*
*用途:判断两个point类对象是不是相等,与上面的区分开,我们重载了 ==,不意味着
* == 对应的 != 就是取反,因为我们还没给!= 重载对于point的运算
*/
bool operator!=(Point p1, Point p2);
#endif
注意:这里我们没有把运算符重载的函数原型放入到类的里面,原因是它根本就不属于类,它是自由函数(就是上一篇写的第二种情况 )。但是它又与point类有着关联,所以我们把它放在point的头文件里面。
pointpriv.h
friend bool operator==(Point p1, Point p2);
private:
int x;
int y;
这里提一下为什么不把 != 的重载也设为friend函数放进来,因为 !=的重载没用到Point类的私有成员,所以也没必要这么做,它用的只是 == 运算符返回的结果而已。
Point.cpp
#include <string>
#include "Point.h"
#include "strlib.h"
using namespace std;
Point::Point(){
x =
0;
y =
0;
}
Point::Point(
int xc,
int yc) {
x = xc;
y = yc;
}
int Point::getX(){
return x;
}
int Point::getY(){
return y;
}
string Point::toString(){
return "(" + integerToString(x) +
"," + integerToString(y) +
")";
}
bool operator==(Point p1, Point p2) {
return p1.x == p2.x && p1.y == p2.y;
}
bool operator!=(Point p1, Point p2) {
return !(p1 == p2);
}
ostream &
operator<<(ostream & os, Point pt) {
return os << pt.toString();
}
关于 strlib头文件,参考strlib文件