C++——运算符重载

本文介绍了C++中的运算符重载概念,包括为什么需要运算符重载,如何在类中和通过友元函数实现运算符重载。通过示例展示了如何重载+运算符,以及对输入输出运算符的重载。此外,还提到了不能在子类中重载的运算符和一些特殊的运算符重载示例,如前置和后置++运算符以及函数对象的使用。
摘要由CSDN通过智能技术生成

一、运算符重载的概念

1.什么是运算符重载:

运算符重载指的是对已有的运算符重新定义新的运算规则,已适应不同的数据类型,当然重载之后之前的运算规则还是有的

2.为什么要进行运算符重载

运算符重载之后可以让运算符去适应不同的数据类型,对于基本数据类型,系统给出了运算符的操作规则,对于自定义数据类型来说,系统是不知道给出什么规则的

如下:
class student
{
	int id;
	int age;
	char name[20];
public:
	student(int id,int age,cosnt char *name)
	{
		this->id=id;
		this->age=age;
		strcpy(this->name,name);
	}
}
student stu1(1,23,"李四");
student stu2(2,34,"王五");
stu1+stu2;//如果是这样相加,那么应该加的是什么呢?编译器是不知道,所以编译器就提供了运算
符重载这个机制,让用户自定义运算符的运算符规则

二、运算符重载

1.运算符重载类中定义

1、关键字:
operator,通过关键字来定义运算符重载(跟写个函数一样)
2、定义:
函数返回值类型 operator 要重载的运算符(参数列表)
{
	函数体;
}
这里我们就把这个运算符的使用,理解为调用函数,只不过和平时的我们用的函数调用不太一样
示例: 这里我们就用上面的那个student类为示例
重载+号: 我想让两个对象相加,并返回一个整数
	int operator+(const student& stu)
	{
		//其实我想让两个对象里面的两个年龄相加,并返回他们的和
		//这里里面当然也可以写其他的,可以说你想什么功能都可以,返回值也自己定
		return this->age+stu.age;
	}
注意:因为我们这个运算符是在类中写的,所以是通过对象调用的,那么this指针会占一个参数,而且是第一个参数,也就是说如果我们重载一个运算符,是在类中,而这个运算符是个单目运算符,那么参数列表就不用写东西了,是双目,那么就需要传另一个参数进来绝大部分的运算符重载,都可以参数上面这个+号重载

2.运算符重载的特点

  • 几乎所有的运算符都可以被重载,除 . :: ?: sizefo 这些运算符除外
  • 运算符重载基本出现在类中和结构体中
  • 运算符可以理解为函数的一个表现

3.运算符重载的注意事项

三、使用友元函数,实现运算符重载

类在已经实现且不部分修改的情况下,需要进行运算符重载,就可以通过友元方式进行重载

示例:还是以上面的student类为示例
重载的还是 +int operator+(const student&stu1,const student&stu2)
{
	return stu1.id+stu2.id;
}
应为这个是直接访问的私有成员,所以需要在类中声明一句
	friend int operator+(const student&stu1,const student&stu2);
使用可以 直接stu1+stu2; 也可以operaot+(stu1,stu2);
但是通常,像这些数据一般都有接口可以访问,那么就可以通过接口访问,就不需要这个friend声明了

四、两个不能子啊类中重载的运算符,和一些运算符重载的示例

class node
{
	int val;
public:
	node(){val=10;}
	friend istream>>(istream& is,node& n);//输入
	friend istream<<(ostream& os,node& n);//输出
	/*前后++*/
	node& operator++()//前++
	{
		this->val++;
		return *this;
	}
	node operator++(int)//后++
	{
		node temp=*this;//保存val的值
		this->val++;//val++
		return temp;//返回的是没有++的val的值
	}
	//这里int是占位参,不用传参,只是用来区分前后++的
	/*伪函数*/
	void operator()()
	{
		cout<<"我是一个函数呀!!"<<endl;
	}
};
friend istream>>(istream& is,node& n)//输入
{
	is>>n.val;
	return is;
}
friend istream<<(ostream& os,node& n)//输出
{
	os<<n.val;
	return os;
}
使用:
node n;
cin>>n;//对对象里面的val赋值
cout<<n;//输出对象里面的val的值
n();//输出 我是一个函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值