首页/文章/ 详情

【编程语言】C 中的运算符重载

2年前浏览2303
C 程序编写中,运算符重载是一个重要的工具,其可以通过“重载”实现对运算符的自定义。例如,对于两个不同的类a_classb_class,默认情况下无法直接对“a_class b”进行运算,但是通过对“ ”运算符的重载,就可以实现该运算,具体定义方式如下:

double_vector.h文件:

image.png

double_vector.cpp文件:

image.png

主程序文件:

image.png

计算结果:


实际上,重载运算符就是定义函数名为“operator 运算符”的函数,在使用时如果编译器在程序语句中发现该运算符,就将其等效为调用“operator 运算符”。
一般而言,可以重载的运算符可分为单目运算符,如“自增 ”“自减--”“负号-”等;双目运算符,如“加 ”“减-”“大于>”等;三目运算符“b ? x :y”等。
C 的大部分运算符既可说明为成员运算符重载函数,又可说明为友元运算符重载函数。取决于实际情况和习惯来选择合适的运算符函数。
一般而言,对于双目运算符,将它重载为友元运算符比重载为成员运算符便于使用。对于单目运算符,则选择成员运算符较好。如果运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则运算符重载必须用友元函数。以下的经验可供参考:
(1)对于单目运算符,建议选择成员函数。
对于运算符“=()[ ]->” 只能作为成员函数。
对于运算符“ =-=/=*=&=!=~=%=<<=>>=”,建议重载为成员函数。
对于其他运算符,建议重载为友元函数。
(2)对于双目成员运算符重载函数,编译器总是调用“运算符左右的”第一个成员变量的重载函数。A B,等效于 A.operator (B)
所以例如当“ ”运算符针对两个不同类型时,应该重载两个friend operator 函数实现交换律:

image.png

这是因为,如果采用成员运算符重载,a 100即是a.operator (100),而100 a则是100.operator (a),由于后者100是内置类型int,无法重载“ ”,因此无法实现“加法交换律”。

(3)对于单目成员运算符重载函数,如果要重载运算符 U 为类成员函数,使之能够实现表达式 U oprd,其中 oprd A类对象,则 U 应被重载为 A 类的成员函数,无形参。经重载后,表达式 U oprd 相当于 oprd.operator U()

因此对于重载“前置负号”:

image.png

具体调用:

image.png

或者

image.png

重载“后置负号”:

image.png

具体调用:

image.png

或者

image.png

重载“减号”:

image.png

具体调用:

image.png

或者

image.png

(4)输出操作符“<<”的重载:

image.png

调用时:

image.png

以上四种方式均可。设置返回std::ostream类型是为了可以连续使用<<及使用endl。
以上就是C 中运算符重载的简要内容,感谢您的阅读!

来源:有限元术
科普代码&命令其他软件
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-07-04
最近编辑:2年前
寒江雪_123
硕士 | cae工程师 签名征集中
获赞 49粉丝 106文章 57课程 9
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈