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++提供了一种方式——运算符重载,来满足我们对于类对象进行的操作。
但是需要注意并不是所有的运算符都可以重载。
对于前面的Integer类,重载加法运算符
Integer operator +(Integer&other){
return Integer(this->_num+other._num);
}
重载好了之后,c=a+b
这个语句就不会报错了。
对于类的运算符重载的方式有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
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;
}