什么样的网站不备案,初学者怎么做php网站,企业做网站天津,家居企业网站建设新闻引例
class Integer{
public:Integer(int num):_num(num){}int getValue(){return _num;}
private:int _num;
};现在有两个Integer对象a,b。想让a和b相加得到的结果给对象c#xff0c;现在可以肯定的是cab编译后肯定会报错
请注意这条信息no match for operator (oper…引例
class Integer{
public:Integer(int num):_num(num){}int getValue(){return _num;}
private:int _num;
};现在有两个Integer对象a,b。想让a和b相加得到的结果给对象c现在可以肯定的是cab编译后肯定会报错
请注意这条信息no match for operator (operand types are Integer and Integer) 现有的加法运算符无法对两个Integer对象进行操作那么有什么方法可以让加法运算符可以对两个Integer对象进行操作实现的方法就是运算符重载。
运算符重载
我们平常常见的算术运算符、逻辑运算符等运算符都是系统库函数里面已经存在的所以运算符可以直接用于我们常用的数据类型。然而对于我们自定义的类实例化的对象系统没有与之相关的运算符可以操作但是为了使我们编写程序时更加便捷C提供了一种方式——运算符重载来满足我们对于类对象进行的操作。
但是需要注意并不是所有的运算符都可以重载。
可以重载的运算符
算术运算符 - * / %自增、自减运算符 –位运算符| ~ ^ 逻辑运算符|| !关系运算符 ! 赋值运算符 - / % | ^ 单目运算符 - * 动态内存分配new delete new[] delete[]其他运算符() - , []
不能重载的运算符
. 成员访问运算符:: 域运算符.* -* 成员指针访问运算符szieof 长度运算符?: 条件运算符
运算符重载的语法形式 对于前面的Integer类重载加法运算符
Integer operator (Integerother){return Integer(this-_numother._num);
}重载好了之后cab这个语句就不会报错了。
对于类的运算符重载的方式有3种
重载为类的非静态成员函数重载为类的有元函数重载为普通函数
上面的那一种就是重载为类的非静态成员函数
重载为类的有元函数
Integer operator(const Integerleft,const Integerright){return Integer(left._numright._num);
}类的非静态成员函数方式重载的这个函数还是有点点问题的
Integer operator (const Integerother){return Integer(this-_numother._num);
}考虑这样的情况
const i1Integer(1);
const i2Integer(2);
auto i3i1i2那么则个时候就会报错
其实这个错误很好理解i1和i2都是常对象常对象只能访问常成员那i1就根本访问不了operator ()这个函数当然会报错。改正的方法也很简单operator ()加上一个const就可以了
Integer operator (const Integerother)const{return Integer(this-_numother._num);
}上面是在讨论对象对象除了这种情况是不是还会有 对象数 数对象 Integer count1a1 Integer count22b
对于这种形式的Integer count1a1通过非静态成员函数进行重载就可以了
Intger operator(int v)
{return Intger(this-number_ v);
}但是对于这个Integer count22b如果还通过非静态成员函数进行重载那么就会出错
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 Integerother)const {return Integer(this-_numother._num);}//friend Integer operator(const Integerleft,const Integerright);Integer operator (const Integerother){this-_numother._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 Integerleft,const Integerright){return Integer(left._numright._num);
} */
Integer operator(int v, const Integer right)
{return Integer(right._num v);
}
int main(){Integer a(1),b(2);Integer cab;const Integer i1(1);const Integer i2(2);auto i3i1i2;Integer count1a1;Integer count22b;
}ger a(1),b(2); Integer cab; const Integer i1(1); const Integer i2(2); auto i3i1i2; Integer count1a1; Integer count22b; }