14重载运算与类型转换
14.1基本概念
Operator重载的运算符包含返回类型、参数列表以及函数体。
左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数。
不应该被重载:逻辑与、或运算符,逗号运算符;&&和||;不重载逗号运算符和取地址运算符。
重载的赋值运算应该继承而非违背其内置版本的含义。
选择作为成员或者非成员
如果我们想提供含有类对象的混合类型表达式,则运算符必须定义成非成员函数。它的左侧运算对象必须是运算符所属类的一个对象。
14.2输入和输出运算符
输入输出运算符是非成员函数
14.3算术和关系运算符
14.3.1相等运算符设计准则
14.3.2关系运算符设计准则
14.5下标运算符
必须是成员函数
14.6递增和递减运算符
前置++i;
后置i++
接受一个额外的(不被使用)int类型的形参,编译器会提供0
14.7成员访问运算符
14.8函数调用运算符
定义了调用运算符,则该类的对象称作函数对象。可以调用这种对象,“行为像函数一样”。
14.8.1lambda是函数对象
....
14.8.2标准库定义的函数对象
14.8.3可调用对象与function
标准库function类型
重载的函数与function
不能(直接)将重载的函数名字存入function类型的对象中,以免二义性,解决途径是存储函数指针。
14.9重载、类型转换和运算符(还未get到点)
14.9.1类型转换运算符
可以面向任意类型(void除外)进行定义,不允许转换成数组或者函数类型,但允许转换成指针(包括数组指针及函数指针)或者引用类型。必须定义成类的成员函数,通常不应该改变转换对象的内容,一般定义成const成员。
显示的类型转换运算符(explicit),一般要通过显示的强制类型转换。但存在一个例外,就是表达式被用作条件,以下表达式出现下列位置时,会隐式的执行转换。
14.9.2避免有二义性的类型转换
14.9.3函数匹配与重载运算符