1.问题描述
定义Point类,有成员变量x、y,为其定义 友元函数 实现 重载运算符+ 。
2.问题分析
要 定义“友元函数”实现对运算符“+”重载,先分析如何实现。
(1)首先:
因为是 定义“友元函数”对运算符“+”重载,因此 重载函数为“非成员函数”。那么非成员函数运算符重载函数格式是什么样的?如下所示:
返回值类型 operator 运算符(形参表){
函数体;
}
因此运算符+函数定义为:
Point operator +(const Point &p1,const Point &p2){
Point p3;
p3.x=p1.x+p2.x;
p3.y=p1.y+p2.y;
return p3;
}
其中,"Point"为类名,返回Point对象。operator为关键字,其后为要重载的运算符“+”。参数列表中为Point对象数据类型,const表示执行过程中不能改变对象,避免数据出错。
(2)其次:
我们要对Point对象信息,即(x,y)中x,y值输出,两种方法:
第一种:定义输出函数,相应对象调用函数即可。(常用)
第二种:重载“<<”运算符,使其能输出Point对象数据。(为了加深大家理解运算符重载,程序中采用的是重载“=”运算符。)(注释中也为大家提供了第一种输出函数。)
(3)最后:
如果我们希望Point对象之间可以直接“赋值”,因此我们可以考虑将运算符“=”也进行重载,(注意:运算符“=”只能重载为“类成员函数”)。语法格式如下:
返回值类型 类名::operator 运算符(形参表){
函数体;
}
与上面 “非成员函数运算符重载” 格式区别 在于 加了“类名”的限定。
3.代码实现
//导入头文件
#include<iostream>
using namespace std;
//定义类
class Point{
public:
//无参构造
Point(){
//初始化值为 0
x=0;
y=0;
}
//有参构造
Point(float x1,float y1){
x=x1;
y=y1;
}
//重载运算符 + 声明
friend Point operator+(const Point &p1,const Point &p2);
//重载 = 声明
Point& operator=(const Point &pd);
//重载 << 声明
friend ostream & operator<<(ostream &out,const Point &p);
/* 一般函数显示信息,自行选用
void display(){
cout<<"("<<x<<","<<y<<")"<<endl;
}
*/
~Point(){} //析构函数
private:
float x; //x坐标
float y; //y坐标
};
//+重载
Point operator+(const Point& p1,const Point& p2){
Point p3;//创建临时对象p3
p3.x = p1.x + p2.x;//x 求和
p3.y = p1.y + p2.y;//y 求和
return p3;//返回对象p3
}
//=重载
Point & Point::operator =(const Point &pd){
x=pd.x;
y=pd.y;
return *this;
}
//<<重载
ostream & operator<<(ostream &out,const Point &p){
out<<"("<<p.x<<","<<p.y<<")";
return out;//返回对象值
}
//主函数
int main(){
//创建对象
Point p1(7,6);
Point p2(1,2);
Point p3(1,1);
Point p4(2,4);
Point p5;
cout<<"p1初始坐标:"<<p1<<endl<<endl;
cout<<"p2初始坐标:"<<p2<<endl<<endl;
cout<<"p3初始坐标:"<<p2<<endl<<endl;
cout<<"p4初始坐标:"<<p2<<endl<<endl;
p5=p1+p2;
cout<<endl<<"p1 + p2 ="<<p5;
p5=p3+p4;
cout<<endl<<"p3 + p4 ="<<p5;
return 0;
}