本月点恒四部曲终结篇之浅谈操作符重载

本文深入解析操作符重载的概念、规则及注意事项,通过具体代码实例,详细讲解如何重载二元、一元及特殊运算符,并深入探讨操作符重载在编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是操作符重载?为何要操作符重载?
        所谓的操作符重载,是指我们把一些基本的运算符,定义出新的方法和功能,它所针对的,是我们新定义的类类型。那么,为什么要操作符重载呢,这是因为我们自定义的类型并不是默认的基本类型,当我们对它们进行运算符操作时,编译器并不能理解我们要干什么,所以就需要我们亲手为新类型定义一些实现方法。操作符重载的本质,实际上就是类成员函数的调用。

操作符重载的规则及注意事项
        首先,操作符的结合性与优先级不可以被改变。
        其次,以下几个操作符不可以重载,它们分别是指针运算符、成员运算符、作用域运算符【::】、sizeof运算符和条件运算符【?:】。

操作符重载的实现方法
       操作符重载分为两种形式,成员函数重载和友元函数重载。本博重点分析前者,后者的话除了形式上的小不同之外,其它都可以同理类推【实际是因为本人跟友元不熟】。
       而可以重在的操作符,大致又分为两类:二元操作符和一元操作符。我们先从二元操作符开始,比如,介绍一下如何重载“+”运算符:
#include <iostream>
#include <string>
using namespace std;

class I
{
public:
	I(int a1) { a = a1; }

    I operator +(I c) //这个就是操作符重载函数
	{
		I temp(0);
		temp.a = a - c.a; 
		return temp;
	}

	int a;
};

int main()
{
	I i(10),j(3),k(0);
	k = i + j;  /*这一句,实际上就相当于调用了I的成员函数operator+(&i,j)*/
	cout << k.a << endl;
	system("pause");
	return 0;
}

       把上面的代码编译运行一下,相信最后的输出结果是7而不是13,为什么?请注意代码中的操作符重载函数的定义,虽然我们使用的是+操作符,但实际里面执行的是减法操作,我之所以挂羊头卖狗肉,也是为了证明一下操作符函数的实现方法是比较自由的。
       介绍完了二元操作符,接下来说说一元操作符。在上面的+号例子中,相信大家都可以举一反三了,所以在一元操作符的介绍中,我们就拿一个比较特殊的操作符来开刀吧,它就是++操作符:

那么++类型的一元符有什么特殊呢?请看代码中的注释1和注释2,前者代表声明了一个后置++操作符函数,后者代表了声明了一个前置++操作符函数。二者除了“&”符的不同外,还有一个参数表中有误【int】的不同,那么在后置++函数中,为什么要加那个int呢?其实,这个int并没有什么具体的意义,之所以加上它,纯粹是一个标识符,用于区分出++是前置还是后置,有就是后置,没有就是前置。
       最后,再提特殊的例子:【<<】运算符,请看图片:

那么,这个【<<】特殊在哪里呢?首先,【<<】操作符重载必须得用友元形式,这是因为成员操作符函数会隐藏第一个参数,而且那个隐藏的默认参数一定是this的引用类型。而【<<】的操作符函数中,第一个参数必须得是&ostream类型,两者明显不符,所以成员函数无法声明定义【<<】操作符的重载。其次,【<<】操作符函数的返回类型必须得是ostream类型,这点也要切记。
       
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值