欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符

发布时间:2025/3/21 c/c++ 26 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
运算符
双目算术运算符+ (加),-(减),*(乘),/(除),% (取模)
关系运算符==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
  • 通常情况下,算术和关系运算符应该定义为非成员函数,以便两侧的运算对象进行转换。
  • 由于这些运算符一般不会改变运算对象的状态,所以形参都是常量引用。
  • 如果类同时定义了算数运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋值来实现算数运算符。

1. 算术运算符

通常会计算它的两个运算对象并得到一个新值,这个值通常存储在一个局部变量内,操作完成后返回该局部变量的副本作为结果(返回类型建议设置为原对象的const类型)。

Sales_data operator +(const Sales_data &lhs,const Sales_data &rhs) {Sales_data sum = lhs;sum += rhs;return sum; }

2. 相等运算符(Equality Operators)

设计准则:

  • 如果类在逻辑上有相等性的含义,则应该定义operator==而非一个普通的命名函数。这样做便于使用标准库容器和算法,也更容易记忆。
  • 通常情况下,operator==应该具有传递性。
  • 如果类定义了operator==,则也应该定义operator!=。
  • operator==和operator!=中的一个应该把具体工作委托给另一个。
bool operator==(const Sales_data &lhs, const Sales_data &rhs) {return lhs.isbn() == rhs.isbn() &&lhs.units_sold == rhs.units_sold &&lhs.revenue == rhs.revenue; }bool operator!=(const Sales_data &lhs, const Sales_data &rhs) {return !(lhs == rhs); }

3. 赋值运算符

  • 不论形参的类型是什么,赋值运算符运算符都必须定义为成员函数,复合赋值运算符也通常如此。
  • 两类运算符都应该返回左侧运算对象的引用(赋值运算符和复合赋值运算符)。
  • 可以使用别的类型作为右侧运算对象
//重载赋值运算符 StrVec &StrVec::operator=(initializer_list<string> il) {//alloc_copy分配内存空间,并从给定安慰内拷贝元素auto data=alloc_n_copy(il.begin(),il.end());free(); // 销毁对象中的元素并释放内存空间elements=data.frist;//更新数据成员,使其指向新空间first_free=cap=data.second; return *this; } //复合赋值运算符 // member binary operator: left-hand operand is bound to the implicit this pointer // assumes that both objects refer to the same book Sales_data& Sales_data::operator+=(const Sales_data &rhs) {units_sold += rhs.units_sold;revenue += rhs.revenue;return *this; }

4. 关系运算符(Relational Operators)

定义顺序关系。 eg. 关联容器中用到的小于运算符

  • 如果某个类在逻辑上有相等性的含义,则该类应该定义operator==。
  • 定义了相等运算符的类通常也会定义关系运算符。
  • 如果类定义了operator==,则关系运算符的定义应该与operator==保持一致。特别是,如果两个对象是不相等的,那么其中一个对象应该小于另一个对象。
  • 如果存在唯一一种可靠的<定义,则应该考虑为这个类定义<运算符。如果类同时还包含==,则当且仅当<的定义和==产生的结果一致时才定义<运算符。
//重载复合赋值运算符 StrVec &StrVec::operator+=(initializer_list<string> il) {unit_sold+=rhs.units_sold;revenue+=rhs.revenue;return *this; }

总结

以上是生活随笔为你收集整理的C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。