小小白学C++之运算符重载

今天学习运算符重载使用和友元函数

运算符重载

对象和运算符之间的关系。

运算符:

赋值运算符 =

算术运算符 + - * / %

关系运算符 >  >= < <=  == !=

逻辑运算符 && || !

其他运算符 ++ -- ?:

位运算符   & | ^ ~ <<  >>

1 对象遇到运算符会有什么表现

证明步骤:1.设计类

                  2.创建对象

                  3.对对象进行运算操作

2 运算符重载使用

对于已有的运算符只能对基本数据类型进行操作,没有办法对自定义的数据类型进行操作。

如果想让自定义数据类型执行运算操作,需要给运算符赋予新功能,实现数据运算。

运算符重载——函数重载

tips:

1.运算符的重载比必须是已有的运算符,不能随意创造。

2.重载运算符不能改变原有运算符的规则和操作数。

3.重载后的功能要和原有的运算符功能一致,不要没有目的的重载运算符。

4.运算符重载最好有无参构造函数,因为在计算的过程中有可能会用到临时对象。

5.重载后使用运算符的时候就相当于调用运算符重载函数 

有一些运算符不允许重载:

成员访问符号:.

成员访问符号:.*

计算内存: sizeof

三目运算符:?:

限定符: ::

3 运算符重载的实现

成员函数、友元函数,计算的时候一般需要访问数据,在类中数据成员一般是私有的。

3.1成员函数

类内定义:

返回值类型 operator 运算符(形参)

{

}

类外定义:

类内声明:返回值类型 operator 运算符(形参);

类外定义:返回值类型 类名::operator 运算符(形参);

例:实现我们point类的+操作

#include<iostream>

using namespace std; 

class point
{
private:
	int xp;
	int yp;			
public:
	point(){
		
	}
	
	point(int x,int y)
	{
		xp=x;
		yp=y;
	}
	
	void show()
	{
		cout<<"xp:"<<xp<<",yp"<<yp<<endl;
	}
	
	point operator +(const point &p1)
	{
		point c;
		c.xp = xp + p1.xp;
		c.yp = yp + p1.yp;
		return c;
	}
};


	
int main()
{
	point a(1,3);
	point b(2,5);	
	
	point c=a+b;  // a.operator+(b) 
	c.show();

	
	return 0;
 } 

tips:

        运算符的重载使用成员函数实现的:

        因为类里面有一个this指针,指向运算符的左侧操作数,所以重载数的形参比实际运算符的新参少一个。

        如果是双目运算符——只有一个操作数

        如果是前置单目运算符——省略操作数 ++a——先加后用

        如果是后置单目运算符——需要写一个整型参数,但是这个参数不用,主要是和前置运算符区分 a++——先用后加

 3.2 友元函数

普通函数做一个类的友元函数运算符的重载。

重载函数的形参和实际的运算符的参数要一致

双目运算符传2个

单目运算符可传可不好传

步骤:

1.定义友元函数

返回值类型 operator 运算符(形参)

{

}

2.在类内声明友元

friend 返回值类型 operator 运算符(形参);

例:实现我们point 类的-的重载

返回值类型:point

函数名:operator-

形参:const point &a,const point &b

point operator -(const point &a,const point &b)

{

        point c;

        c.xp = a.xp - b.xp;

        c.yp = a.yp - b.yp;

        return c;

}

point类中:friend point operator -(const point &a,const point &b)

必须要使用友元函数重载的运算符

1、左侧的对象是常量  5 + a  // 5.operator+(a)

2、输入输出重载    <<    >>

iostream --- istream    ostream

输入 ---- istream

例子:友元重载输入

#include<iostream>

using namespace std; 

class point
{
private:
	int xp;
	int yp;			
public:
	point(){
	}
	point(int x,int y)
	{
		xp=x;
		yp=y;
	}
	
	void show()
	{
		cout<<"xp:"<<xp<<",yp"<<yp<<endl;
	}
	friend istream &operator >>(istream &is,point &a);
};
istream &operator >> (istream &is,point &a)
{
	// 需要使用一个输入流 参数
	// 点参数
	cout << "请输入第一个参数:";
	is >> a.xp;
	cout << "请输入第二个参数:";
	is >> a.yp;

	return is;
}

	int main()
{
	point a5;
	cin >> a5;
	a5.show();
	
	point b5,c5;
	cin >> b5 >> c5;
	b5.show();
	c5.show();
	
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值