【c++】简单了解运算符重载

编程入门 行业动态 更新时间:2024-10-14 10:44:45

【c++】简单了解<a href=https://www.elefans.com/category/jswz/34/1771114.html style=运算符重载"/>

【c++】简单了解运算符重载

引例

class Integer{
public:Integer(int num):_num(num){}int& getValue(){return _num;}
private:int _num;
};

现在有两个Integer对象a,b。想让a和b相加得到的结果给对象c,现在可以肯定的是c=a+b编译后肯定会报错

请注意这条信息no match for 'operator+' (operand types are 'Integer' and 'Integer')
现有的加法运算符无法对两个Integer对象进行操作,那么有什么方法可以让加法运算符可以对两个Integer对象进行操作?实现的方法就是运算符重载。

运算符重载

我们平常常见的算术运算符、逻辑运算符等运算符都是系统库函数里面已经存在的,所以运算符可以直接用于我们常用的数据类型。然而对于我们自定义的类实例化的对象,系统没有与之相关的运算符可以操作,但是为了使我们编写程序时更加便捷,C++提供了一种方式——运算符重载,来满足我们对于类对象进行的操作。

但是需要注意并不是所有的运算符都可以重载。

可以重载的运算符

  • 算术运算符:+ - * / %
  • 自增、自减运算符:++ –
  • 位运算符:| & ~ ^ << >>
  • 逻辑运算符:|| && !
  • 关系运算符:== != < > <= >=
  • 赋值运算符:= += -= /= %= &= |= ^= <<= >>=
  • 单目运算符:+ - * &
  • 动态内存分配:new delete new[] delete[]
  • 其他运算符:() -> , []

不能重载的运算符

  • . 成员访问运算符
  • :: 域运算符
  • .* ->* 成员指针访问运算符
  • szieof 长度运算符
  • ?: 条件运算符

运算符重载的语法形式

对于前面的Integer类,重载加法运算符

Integer operator +(Integer&other){return Integer(this->_num+other._num);
}

重载好了之后,c=a+b这个语句就不会报错了。

对于类的运算符重载的方式有3种

  1. 重载为类的非静态成员函数
  2. 重载为类的有元函数
  3. 重载为普通函数

上面的那一种就是重载为类的非静态成员函数

重载为类的有元函数

Integer operator+(const Integer&left,const Integer&right){return Integer(left._num+right._num);
}

类的非静态成员函数方式重载的这个函数还是有点点问题的

Integer operator +(const Integer&other){return Integer(this->_num+other._num);
}

考虑这样的情况

const i1=Integer(1);
const i2=Integer(2);
auto i3=i1+i2

那么则个时候就会报错

其实这个错误很好理解,i1和i2都是常对象,常对象只能访问常成员,那i1就根本访问不了operator +()这个函数,当然会报错。改正的方法也很简单,operator +()加上一个const就可以了

Integer operator +(const Integer&other)const{return Integer(this->_num+other._num);
}

上面是在讨论对象+对象,除了这种情况是不是还会有 对象+数 数+对象
Integer count1=a+1 Integer count2=2+b

对于这种形式的Integer count1=a+1通过非静态成员函数进行重载就可以了

Intger operator+(int v)
{return Intger(this->number_ + v);
}

但是对于这个Integer count2=2+b,如果还通过非静态成员函数进行重载,那么就会出错

Integer operator+(int v,const Integer& right)
{return Integer(this->number_ + v);
}

因为加法运算符有左右两个操作数,那么重载加法运算符也要有两参数,声明为非静态成员函数,那么隐含的this指针算一个,那么函数的参数列表里写一个就可以了。上面那个加上隐含的this就三个参数了。解决的方法就是重载为类的有元函数

这篇文章就到这里了,希望你能对运算符重载有一个初步的了解。下面的代码是用到的例子

#include <iostream>
class Integer{friend Integer operator+(int v, const Integer& right);
public:Integer(int num):_num(num){}int& getValue(){return _num;}Integer operator +(const Integer&other)const {return Integer(this->_num+other._num);}//friend Integer operator+(const Integer&left,const Integer&right);Integer& operator =(const Integer&other){this->_num=other._num;return *this;}Integer operator+(int v){return Integer(this->_num + v);}/* Integer operator+(int v,const Integer& right){return Integer(this->number_ + v);} */
private:int _num;
};
/* Integer operator+(const Integer&left,const Integer&right){return Integer(left._num+right._num);
} */
Integer operator+(int v, const Integer& right)
{return Integer(right._num + v);
}
int main(){Integer a(1),b(2);Integer c=a+b;const Integer i1(1);const Integer i2(2);auto i3=i1+i2;Integer count1=a+1;Integer count2=2+b;
}

ger a(1),b(2);
Integer c=a+b;
const Integer i1(1);
const Integer i2(2);
auto i3=i1+i2;
Integer count1=a+1;
Integer count2=2+b;
}


更多推荐

【c++】简单了解运算符重载

本文发布于:2023-12-05 01:51:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1662707.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:运算符   简单

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!