4.1 基础
-
运算对象转换
类型转换大多数都合乎情理,但是小整数类型(如bool,char,short等)通常会被提升成较大的整数类型,主要是int。
-
重载运算符
当运算符作用于类类型的运算对象时,用户可以自行定义其含义。因为这种自定义的过程事实上是为了已存在的运算符赋予了另外一层含义,所以称之为重载运算符。
我们使用重载运算符时,其包括运算对象的类型和返回值的类型,都是由该运算符定义的,但是运算对象的个数,运算符的优先级和结合律都是无法改变的。
-
左值和右值
当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
在需要右值的地方可以用左值来代替,但是不能把右值当作左值(也就是位置)使用。当一个左值被当作右值使用时,实际使用的是它的内容(值)。
- 赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果仍然是一个左值。
- 取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,这个指针是一个右值。
- 内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符的求值结果都是左值。
- 内置类型和迭代器的递增运算符作用于左值运算对象,所得结果也是左值。
使用关键字decltype的时候,左值和右值也有所不同。如果表达式的求值结果是左值,decltype作用于该表达式得到一个引用类型。
假设p的类型是int ,因为解引用运算符生成左值,所以decltype(p)的结果是int&,因为取地址符生成右值,所以decltype(*p)的结果是int **,结果是一个指向整型指针的指针。
4.2算数运算符
-
算数运算符
参与取余运算的对象必须是整数类型。
(-m) % n == - (m % n);
m % (-n) == m % n;
-
赋值运算符