[1.x] 运算符重载

image.png image.png

  • 我们只能重载C++已有的运算符
  • 我们只能在一个自定义的类(结构)中重载运算符
  • 我们无法改变运算符的目数
  • 我们无法改变优先级

运算符重载有两种形式:

  • 成员重载
  • 全局重载

  • 还存在其他形式的重载,比如输入输出流的重载、自动类型转换的重载等

    [1.1.x] 成员运算符重载

    | image.png
    - 图中该运算符返回const Integer是为了避免得到的答案被作为左值使用
    - 图中运算符”+”虽然是双目运算符,但是只需要显式写出一个参数,另外一个参数就是加号左侧的this
    成员运算符重载后的运算符同样存在隐式类型转换,但是一般都是以运算符左侧的receiver类型为目标
    - z = x + 1;会尝试将1转换成typeof(x)
    - z = 1 + x;会尝试将typeof(x)转换成1
    | | —- |

[1.2.x] 全局运算符重载

image.png
- 为了使其能访问私有变量,要么设置该函数为友元,要么提供访问成员变量的方法,并通过该方法访问
- 二元运算重载中,只要有一个元符合条件就会尝试类型转换

[1.3.x] 运算符重载策略

image.png
- 注意,第二条的()指的是通过指针调用函数

[1.4.x] 运算符重载规范/原型

| image.png
image.png
image.png
- E指索引的元素类型,T指“数组”类型
- 如map<string,int> mp;中,mp[i]下,EintTmap<string,int>
image.png
- prefix指的是运算符在前面,即++x
image.png
image.png | | —- |

[2.x] 输入输出流中的重载

| image.png
- 这个是对于cin >>来说的
- 需要注意,需要return``istream(输入流)
image.png
创建自定义控制符```cpp // define your own manipulators // skeleton for an output stream manipulator ostream &manip(ostream &out){ // … return out; }

  1. ```cpp
  2. // eg
  3. ostream &tab(ostream &out){
  4. return out << '\t';
  5. }
  6. // cout << "Hello" << tab << "World!" << endl;

| | —- |

[3.x] 自动类型转换重载

| ```cpp // is any type descriptor // no return type

::operator(){ // … return ; } `` <br />- 上述为在类中重载自动转换类型为的框架<br />- 编译器会在发生**→**的时候调用它<br />- 两个类能实现直接赋值即将T赋值给C,当且仅当下面两种情况发生**一种**<br /> 1.T中存在转换为C类的重载<br /> 1.C中存在利用T的构造<br /> - 两者**不能同时存在**<br />- 由于这两种不能同时存在,所以我们才会引入explicit`以保证只能用来构造不能用来转换,来避免这种情况下抛出错误
image.png | | —- |

[4.x] 函数的重载