运算符重载
基本概念
- 对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数。
- 对于一个重载的运算符来说,其优先级和结合律与对应的内置运算符保持一致。
- 通常情况下,不应该重载逗号、取地址、逻辑与和逻辑或运算符。
- 如果一个类包含下标运算符,则它通常会定义两个版本:一个返回普通引用,另一个是类的常量成员并且返回常量引用。
- 箭头运算符永远不能丢掉成员访问这个最基本的含义。
- 类定义了调用运算符,则该类的对象称作函数对象。
- 默认情况下lambda不能改变它捕获的变量。因此在默认情况下,由lambda产生的类当中的函数调用运算符是一个const成员函数。如果lambda被声明为可变的,则调用运算符就不是const的了。
- lambda表达式产生的类不含默认构造函数、赋值运算符及默认析构函数;它是否含有默认的拷贝/移动构造函数则通常要视捕获的数据成员类型而定。
- 编译器可以直接使用该引用而无须在lambda产生的类中将其存储为数据成员。
- 调用形式指明了调用返回的类型以及传递给调用的实参类型。
- 不能(直接)将重载函数的名字存入function类型的对象中。
- 一个类型转换函数必须是类的成员函数;它不能声明返回类型,形参列表也必须为空。类型转换函数通常应该是const。
- 尽管编译器一次只能执行一个用户定义的类型转换,但是隐式的用户定义类型转换可以置于一个标准(内置)类型转换之前或之后。
- 对于类来说,定义向bool的类型转换还是比较普遍的现象。
- 向bool的类型转换通常用在条件部分,因此operator bool一般定义成explicit的。
- 当调用重载函数时,如果两个(或多个)用户定义的类型转换都提供了可行匹配,则我们认为这些类型转换一样好。在这个过程中,我们不会考虑任何可能出现的标准类型转换的级别。
术语
- 直接调用一个重载的运算符函数
- 某些运算符不应该被重载
- 使用与内置类型一致的含义
- 提示:尽量明智地使用运算符重载
- 赋值和符合赋值运算符
- 选择作为成员或者非成员
- 输出运算符尽量减少格式化操作
- 输入输出运算符必须是非成员函数
- 含有状态的函数对象类
- 表示lambda及相应捕获行为的类
- 在算法中使用标准库函数对象
- 不同类型可能具有相同的调用形式
- 标准库function类型
- 重载的函数与function
- 定义含有类型转换运算符的类
- 提示:避免过度使用类型转换函数
- 类型转换运算符可能产生意外结果
- 显式的类型转换运算符
- 转换为bool
- 实参匹配和相同的类型转换
- 二义性与转换目标为内置类型的多重类型转换
- 提示:类型转换与运算符
- 重载函数与转换构造函数
- 重载函数与用户定义的类型转换