今天学习运算符重载使用和友元函数
运算符重载
对象和运算符之间的关系。
运算符:
赋值运算符 =
算术运算符 + - * / %
关系运算符 > >= < <= == !=
逻辑运算符 && || !
其他运算符 ++ -- ?:
位运算符 & | ^ ~ << >>
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;
}