《C++ Primer 第5版》-14.3~14.7算术和关系、赋值、下标、递增和递减、成员访问运算符-康奈尔笔记
14.3.1相等运算符
| Operator +(const Sales_data&s1,const Sales_data &s2); Bool operator==(const Sales_dat&s1,const Sales_da&s2);
Bool operator!=(const Sales_dat&s1,const Sales_da&s2); |
1. 算术和关系运算符 1)通常是非成员函数,以允许对左侧或右侧的运算对象进行转换。都是常量的引用
2)新得到的值通常是局部变量,返回这个副本
3)如果有算术运算符,一般有一个对应的复合赋值运算符,,使用复合赋值来实现算术运算符
2. 相等运算符 1)应该比较对象的每一个数据成员
设计准则: 2)判断两个对象是否相等,显然应该定义operator==而非一个普通的命名函数 3)operator==应该判断所有成员 4)相等运算符具有传递性 5)用到了operator==自然需要用到operator!=反之亦然 6)两个的工作其中一个应该只要委托给另一个 |
14.3.2关系运算符
1. 关系运算符 | Bool operator<(const Sales_data&s1,const Sales_data&s2); |
1. 关系运算符 定义了相等运算符的类通常也包含关系运算符,关联容器更需要小于运算符
关系运算符应该: 1.定义顺序关系,与关联容器中对关键字的要求一致 2.如果类同时也含有==运算符,定义一种关系令其余==保持一致。如果两个对象是!=的,那么一个对象应该<另外一个
Sales_data不应该定义<,不存在逻辑可靠的<定义,不定义<也许更好
因为比较isbn而后面两个成员不符合要求2 若只定义isbn比较 1. 编写了:isbn相同,但后面两个成员不同是不相等的,判定相等 2. 实际情况中: 其中任何一个都不比另一个小则两个对象不相等
若排序比较也不行,因为实际需求会改变顺序
note:需要存在唯一一种可靠的<定义 |
14.4赋值运算符
| StrVec &operator==(std::string); StrVec &Sales_data::operator+=(const Sales_data &rhs) { Units_sold+=units_sold; Return *this; } |
1. 赋值运算符 1)赋值需要是成员 2)类除了拷贝赋值和移动赋值还可以 使用别的类型作为右侧运算对象,如:花括号内定义string什么的类型。 3)若别的类型作为右侧运算对象,不同的是 无需检查自身赋值,因为参数和this指的不是同一个对象 4)note:我们可以重载赋值运算符,不论形参的类型是什么,必须是成员函数 2. 复合赋值运算符 1)不非得是类的成员,更倾向为定义类的内部 2)为了与内置类型的复合赋值保持一致,也要返回以左侧对象的引用
|
14.5下标运算符
1.下标运算符 | String& operator[](size_t m); Const string& operator[](size_t n)const
|
1. 下标运算符 1)必须是成员函数 2)与原始定义兼容,通常返回所访问元素的引用,好处:能让下标可以出现在变量的左右两侧 可以定义常量与非常量版本
|
14.6递增和递减运算符
| StrBlob& operator++(); StrBlob& operator—();// 前置
StrBlob& operator++(int); StrBlob& operator—(int);// 后置
StrBlob stp; Stp.operator++(0); Stp.operator++();
|
1. 递增和递减运算符 1)并不要求必须是类的成员,但改变的正好是所操作对象的状态,建议为成员函数 既有前后版本,应该同时定义 2. 定义前置递增、递减运算符 1)前置: 与内置版本一致,应该返回递增或递减后对象的引用 3. 区分前置与后置 1)就是使用一个参数,不被使用的 一个额外的 2)后置: 返回的是对象的原值,递增或递减之前的值,非引用 4. 显示地调用后置运算符 StrBlob stp; Stp.operator++(0);// 后置 Stp.operator++();// 前置 |
14.7成员访问运算符
| String& operator*()const { Return (*p)[curr]; } String* operator->()const { // 实际工作委托给解引用运算符 Return &this->operator*(); }
StrBlobPtr p (a1); *p = “okay”; Cout<<p->size()<<endl; Cout<<(*p).size()<<endl;//等价p->size(); Cout<<p.operator->size()<<endl; |
1. 成员访问运算符 1)*与-> 2)箭头运算符必须是类的成员,解引用通常也是,不过并非必须如此 3)->返回string的指针,而*返回的是string的引用
Note:重载的箭头运算符必须返回类的指针或者自定义了箭头运算符的某个类的对象 |
相关文章
- 【C++游戏设计】 Sleep睡眠与常用system
- 【VS开发】Visual C++内存泄露检测—VLD工具使用说明
- 【C++】函数对象/STL算法
- 清华大学C++课程学习笔记——第七章 继承和派生
- 清华大学C++课程学习笔记——第五章 数据共享与共享数据的保护
- 23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade
- 三种初步简易的方法求解数值问题 of C++
- c++笔记1
- 《C++游戏开发》笔记十一 平滑动画:不再颤抖的小雪花
- 对C++默认构造函数的理解
- [c++] Copy Control
- C++ Primer 学习笔记与思考_7 void和void*指针的使用方法
- 《C++游戏开发》笔记十三 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
- VTK学习笔记(一) 第一个C++ Demo运行成功
- 【转】VC++包含目录和c/c++ -》附加包含目录的区别
- 【C++】侯捷C++面向对象高级编程-笔记
- 学习C++笔记136
- 在Dev-Cpp中使用C++11中的函数
- C++温故笔记(三)
- C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配
- 《C++ Primer 第5版》-11.3关联容器操作-康奈尔笔记
- 设计模式C++学习笔记之十(Builder建造者模式)
- ROS学习笔记四:用C++编写ROS发布与订阅
- C++:单例模式——线程安全模式、饥汉模式、懒汉模式
- C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用