(C++实例)定义Point类,有成员变量x、y,为其定义友元函数实现重载运算符+

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;
}

4.运行结果

猜你喜欢

转载自blog.csdn.net/m0_54158068/article/details/124995101