十分钟理解C ++中的运算符重载

在C ++中,我们可以使运算符为用户定义的类工作。这意味着C ++能够为运算符提供数据类型的特殊含义,这种能力称为运算符重载。 2020-11-26 14:05:39 C ++运算符数据 聚焦半导体照明及第三代半导体产业发展“风向标” 2020年11月23-25日,第十七届中国国际半导体照明论坛(SSLCHINA 2020)暨2020国际第三代半导体论坛(IFWS 2020)在深圳会展中心召开。

C ++中,我们可以使运算符为用户定义的类工作。这意味着C ++能够为运算符提供数据类型的特殊含义,这种能力称为运算符重载。

在C ++中,我们可以使运算符为用户定义的类工作。这意味着C ++能够为运算符提供数据类型的特殊含义,这种能力称为运算符重载。

[[354257]]

例如,我们可以在String之类的类中重载运算符'+',以便仅使用+就可以连接两个字符串。 算术运算符可能会重载的其他示例类是复数,小数,大整数等。

一个简单而完整的例子

  1. #include<iostream>
  2. usingnamespacestd;
  3. classComplex{
  4. private:
  5. intreal,imag;
  6. public:
  7. Complex(intr=0,inti=0){real=r;imag=i;}
  8. Complexoperator+(Complexconst&obj){
  9. Complexres;
  10. res.real=real+obj.real;
  11. res.imag=imag+obj.imag;
  12. returnres;
  13. }
  14. voidprint(){cout<<real<<"+i"<<imag<<endl;}
  15. };
  16. intmain()
  17. {
  18. Complexc1(10,5),c2(2,4);
  19. Complexc3=c1+c2;
  20. c3.print();
  21. }

操作员功能和普通功能有什么区别?

操作员功能与普通功能相同。唯一的区别是,运算符的名称始终是运算符关键字,后跟运算符的符号,并且在使用相应的运算符时会调用运算符功能。

以下是全局运算符功能的示例。

  1. #include<iostream>
  2. usingnamespacestd;
  3. classComplex{
  4. private:
  5. intreal,imag;
  6. public:
  7. Complex(intr=0,inti=0){real=r;imag=i;}
  8. voidprint(){cout<<real<<"+i"<<imag<<endl;}
  9. friendComplexoperator+(Complexconst&,Complexconst&);
  10. };
  11. Complexoperator+(Complexconst&c1,Complexconst&c2)
  12. {
  13. returnComplex(c1.real+c2.real,c1.imag+c2.imag);
  14. }
  15. intmain()
  16. {
  17. Complexc1(10,5),c2(2,4);
  18. Complexc3=c1+c2;
  19. c3.print();
  20. return0;
  21. }

我们可以让所有运算符超负荷吗?

除了少数操作员之外,几乎所有操作员都可以重载。以下是不能重载的运算符的列表。

为什么不能。(点),::,?:和sizeof是否过载?

请参阅此以获取Stroustrup自己的答案。

关于运算符重载的要点

1)为了使运算符重载起作用,至少一个操作数必须是用户定义的类对象。

2) 赋值运算符:编译器会自动为每个类创建一个默认的赋值运算符。默认赋值运算符确实将右侧的所有成员分配到左侧,并且在大多数情况下都可以正常工作(此行为与复制构造函数相同)。请参阅此了解更多详情。

3) 转换运算符:我们还可以编写可用于将一种类型转换为另一种类型的转换运算符。

  1. #include<iostream>
  2. usingnamespacestd;
  3. classFraction
  4. {
  5. intnum,den;
  6. public:
  7. Fraction(intn,intd){num=n;den=d;}
  8. operatorfloat()const{
  9. returnfloat(num)/float(den);
  10. }
  11. };
  12. intmain(){
  13. Fractionf(2,5);
  14. floatval=f;
  15. cout<<val;
  16. return0;
  17. }

重载的转换运算符必须是成员方法。其他运算符可以是成员方法或全局方法。

4)任何可以用单个参数调用的构造函数都可以用作转换构造函数,这意味着它也可以用于隐式转换为正在构造的类。

  1. #include<iostream>
  2. usingnamespacestd;
  3. classPoint
  4. {
  5. private:
  6. intx,y;
  7. public:
  8. Point(inti=0,intj=0){
  9. x=i;y=j;
  10. }
  11. voidprint(){
  12. cout<<endl<<"x="<<x<<",y="<<y;
  13. }
  14. };
  15. intmain(){
  16. Pointt(20,20);
  17. t.print();
  18. t=30;
  19. t.print();
  20. return0;
  21. }

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 15:03
下一篇 2023年5月5日 15:03

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信