C++运算符重载使用方法

本文详细介绍了C++中的运算符重载,包括加号、减号、位移、自增/自减、赋值和指针运算符的重载方法。讨论了重载运算符的基本概念、特殊运算符的处理以及使用建议,强调了不应重载的关系运算符和短路逻辑运算符。
摘要由CSDN通过智能技术生成

运算符重载基本概念

运算符重载,就是对已有的运算符重新定义,赋予另一种功能,可以适用于不同的数据类型。但是运算符不能改变本来的寓意,不能改变基础类型寓意
在C++中,可以定义一个处理类的新运算符,这种定义像一个普通的函数定义,只是函数名字由operator及其紧跟的运算符组成。它像任何函数一样也是一个函数,当编译器遇到适当的情况时候,就会调用这个函数。
语法
定义重载运算符与定义函数相似 例如 operator¥,这里的¥代表重载的运算符例如, operator+,operator<<。
函数的参数取决于,1.运算符是一元运算符还是二元运算符.2.运算符被定义为全局函数时,一元运算符时一个参数,二元运算符时两个参数。定义为成员函数一元运算符没有参数,二元运算符是一个参数。

可重载的运算符

基本上C语言的运算符都可以重载,但运算符重载的使用时相当受限制。==不能使用没有意义的运算符,不能改变运算符优先级,不能改变运算符的参数个数。==不过不限制,会混淆寓意
在这里插入图片描述
除赋值运算符外,基类(父类)中被重载的操做符都将被派生类继承

特殊运算符

=,[],(),->操做只能通过成员函数进行重载。
<<,>>操做运算符最好通过友元函数进行重载。
不要重载&&,||操作符,因为无法实现短路规则

运算符使用的建议

运算符 建议使用
所有一元运算符 成员
=,->,->*,(),[] 必须时成员
+=,*=,-=,/=,%=,&=,!=,>>= 成员
其他二元运算符 非成员

加号和减号运算符重载

加号运算符重载

同类型对象相加
写成全局函数
class Student
{
   
public:
	Student(int id, int age)
	{
   
		this->Id = id;
		this->Age = age;
	}
public:
	int Id;
	int Age;
};
//全局方式,当编译器调用这个函数
//加号运算符重载写成全局函数需要两个参数,编译器会检查参数是否对应,第一个参数时加号左边,第二个参数时加号右边。
Student operator+(Student& s1, Student& s2)
{
   
	Student temp(s1.Id + s2.Id, s1.Id + s2.Age)
	return temp;
}
void test01()
{
   
	Student s1(1,20);
	Student s2(2,20);
	Student s3 = s1 + s2;//编译器看到两个对象相加,会找operator+的函数
	cout << "Id = " << s3.Id << "age = " << S3.Age << endl;
	//多个对象相加
	Student s4 = s1 + s2 + s3;
	cout << "Id = " << s4.Id << "Age = " << s4.Age << endl;
}
写成类成员函数
class Student
{
   
public:
	Student(int id, int age)
	{
   
		this->Id = id;
		this->Age = age;
	}
	//写成类的成员函数,只需要写一个参数,这个参数是加号右边的数字
	Student operator+(Student& s1)
	{
   
		Student temp(this->Id + s1.Id, this->Age + s1.Age)
		return temp;
	}
public:
	int Id;
	int Age;
};
不同类型对象相加

不同对象的相加与同对象相加非常相似,只需写好需要什么变量相加就可以

class Student
{
   
public:
	Student(int id, int age)
	{
   
		this->Id = id;
		this->Age = age;
	}
public:
	int Id;
	int Age;
};
class Teacher
{
   
public: 
	Teacher(int id)
	{
   
		this->Id = id;
	}
public:
	int Id;
};
//传入两个参数,分别为Student类和Teacher类。
Student operator+(Student& s, Teacher& t)
{
   
	Student temp(s.Id + t.Id, s.Age);
	return temp;
}
//需要改变参数顺序
Student operator+(Teacher& t,Student& s)
{
   
	Student temp(s.Id + t.Id, s.Age);
	return temp;
}
void test02()
{
   
	Student s1(1,20);
	Teacher t1(10);
	Student s2 = s1 + t1;//不同对象相加
	Student s3 
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值