运算符重载器

概念:对已经存在的运算符进行一种全新的定义,赋予不同的数值操作

  1. 加号运算符重载

实现两个自定义的数据类型相加的运算

分析问题

class Person{
public:
	int m_A;
	int m_B;
}

对于person类来说,我想进行一种全新的定义运算,不再说p1.m_A+p2.m_A=p3.m_A,而是p3=p1+p2,但是这么写编译器是无法读取的,只有人才可以看明白,因此我们要对传统的加法运算符进行一个改进,让编译器可以读取我们的指令要求,便有

class Person{
public:
	//必须添加无参构造函数
	Person() {};
	//初始化列表
	Person(int a,int b):m_A(a),m_B(b){};
	//加法运算符重载
	Person operator+(const Person& p){
		Person temp;
		temp.m_A=this->m_A+p.m_A;
		temp.m_B=this->m_B+p.m_B;
		return temp;//此时已经实现了p3=p1+p2的写法存在合理性
	}
	
public:
	int m_A;
	int m_B;
};

这时候编译器未报错,写个test函数去测试一下
void test(){
	Person p1(10,10);
	Person p2(1,3);
	Person p3=p1+p2;
	cout<<"p3.m_A="<<p3.m_A<<endl<<"p3.m_B="<<p3.m_B<<endl;
}

int main(){
	test();
	return 0;
}

运行结果为
在这里插入图片描述
由此可见加法运算符重载可以满足要求

  1. 左移运算符重载

可以自定义输出类型

例如我们可以直接cout一个类对象p
但是这么写编译器无法识别,因为对象p有多个属性,编译器不知道输出哪一个属性,这时候便是左移运算符重载的运用可以巧妙化解

class Person{
public:
	//构造函数
	Person(){};
	//初始化列表
	Person(int a,int b):m_A(a),m_B(b){};
	
public:
	int m_A;
	int m_B;
};
//全局函数实现左移重载,
ostream& operator<<(ostream& out,Person p){
	cout<<"p.m_A="<<p.m_A<<endl<<"p.m_B="<<p.m_B<<endl;
	return out;
}
//测试函数
void test(){
	Person p(10,30);
	cout<<p<<endl;
}

运行结果如下在这里插入图片描述
可见效果是成功的

  1. 递增运算符重载

通过重载递增运算符,可以实现自己的整形数据

比如说我们要实现p.num++,但是想写成p++,这么写编译器不认识,那么我们只好进行递增运算符重载来实现我们的要求

class Person{
public:
	Person(){};
	Person(int num):m_Num(0){};
	
	//前置递增运算符重载
	Person& operator++(){
		m_Num++;
		return *this;
	}

	Person operator++(int){
		//保存当前的数值
		Person temp=*this;
		//当前数值自增
		m_Num++;
		//返回第一步保存的数值
		return temp;
	}
public:
	int m_Num;
};

于此同时,由于是cout<<p++<<endl这种写法,意味着我们也要使用左移运算符重载,写法同第二大点写法相同

ostream& operator<<(ostream& out, MyInteger myint) {
	out << myint.m_Num;
	return out;
}

进行数值测试环节
void test(){
	Person p;
	//前递增测试
	cout<<p<<endl;
	cout<<p++<<endl;
	cout<<p<<endl;
	//后递增测试环节
	Person q;
	cout<<q<<endl;
	cout<<++q<<endl;
	cout<<q<<endl;
}

测试结果如下

在这里插入图片描述
4. 赋值运算符重载

class Person
{
public:

	Person(int age)
	{
		//将年龄数据开辟到堆区
		m_Age = new int(age);
	}

	//重载赋值运算符 
	Person& operator=(Person &p)
	{
        //先判断有无属性在堆区,如果有先释放再深拷贝
		if (m_Age != NULL)
		{
			delete m_Age;
			m_Age = NULL;
		}
		//编译器提供的代码是浅拷贝
		//m_Age = p.m_Age;
		
		//提供深拷贝 解决浅拷贝的问题
		m_Age = new int(*p.m_Age);

		//返回自身
		return *this;
	}


	~Person()
	{
		if (m_Age != NULL)
		{
			delete m_Age;
			m_Age = NULL;
		}
	}

	//年龄的指针
	int *m_Age;

};


void test01()
{
	Person p1(18);

	Person p2(20);

	Person p3(30);

	p3 = p2 = p1; //赋值操作

	cout << "p1的年龄为:" << *p1.m_Age << endl;

	cout << "p2的年龄为:" << *p2.m_Age << endl;

	cout << "p3的年龄为:" << *p3.m_Age << endl;
}

int main() {

	test01();

	//int a = 10;
	//int b = 20;
	//int c = 30;

	//c = b = a;
	//cout << "a = " << a << endl;
	//cout << "b = " << b << endl;
	//cout << "c = " << c << endl;

	system("pause");

	return 0;
}
  1. 关系运算符
class Person{
public:
	Person(string name){
		m_Name=name;
	}
	//布尔类型进行关系的正确判断
	bool operator==(Person p){
		if(this->m_Name==p.m_Name)
			return true;
		else
			return false;
	}

public:
	string m_Name;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值