[1.x] 运算符重载
- 我们只能重载C++已有的运算符
- 我们只能在一个自定义的类(结构)中重载运算符
- 我们无法改变运算符的目数
- 我们无法改变优先级
运算符重载有两种形式:
- 成员重载
全局重载
还存在其他形式的重载,比如输入输出流的重载、自动类型转换的重载等
[1.1.x] 成员运算符重载
|
- 图中该运算符返回const Integer
是为了避免得到的答案被作为左值使用
- 图中运算符”+”虽然是双目运算符,但是只需要显式写出一个参数,另外一个参数就是加号左侧的this
成员运算符重载后的运算符同样存在隐式类型转换,但是一般都是以运算符左侧的receiver类型为目标
-z = x + 1;
会尝试将1
转换成typeof(x)
-z = 1 + x;
会尝试将typeof(x)
转换成1
| | —- |
[1.2.x] 全局运算符重载
- 为了使其能访问私有变量,要么设置该函数为友元,要么提供访问成员变量的方法,并通过该方法访问 - 二元运算重载中,只要有一个元符合条件就会尝试类型转换 |
---|
[1.3.x] 运算符重载策略
- 注意,第二条的 () 指的是通过指针调用函数 |
---|
[1.4.x] 运算符重载规范/原型
|
- E
指索引的元素类型,T
指“数组”类型
- 如map<string,int> mp;
中,mp[i]
下,E
为int
,T
为map<string,int>
- prefix
指的是运算符在前面,即++x
|
| —- |
[2.x] 输入输出流中的重载
|
- 这个是对于cin >>
来说的
- 需要注意,需要return``istream
(输入流)
创建自定义控制符```cpp
// define your own manipulators
// skeleton for an output stream manipulator
ostream &manip(ostream &out){
// …
return out;
}
```cpp
// eg
ostream &tab(ostream &out){
return out << '\t';
}
// cout << "Hello" << tab << "World!" << endl;
| | —- |
[3.x] 自动类型转换重载
| ```cpp
//
``
<br />- 上述为在
类中重载自动转换类型为
的框架<br />- 编译器会在发生
**→**
的时候调用它<br />- 两个类能实现直接赋值即将
T赋值给
C,当且仅当下面两种情况发生**一种**<br /> 1.
T中存在转换为
C类的重载<br /> 1.
C中存在利用
T的构造<br /> - 两者**不能同时存在**<br />- 由于这两种不能同时存在,所以我们才会引入
explicit`以保证只能用来构造不能用来转换,来避免这种情况下抛出错误
|
| —- |