4.4 赋值运算符
赋值运算符的左侧运算对象必须是一个可修改的左值
- 位运算符
<<= >>= &= ^= |=
- 后置递增运算符的优先级高于解引用运算符
*pbeg++ 等价于 *(pbeg++) //此时解引用出来是pbeg未增之前的值,将指针向前移动一个位置
- 运算对象可以按任意顺序求值
4.6 成员访问运算符
解引用运算符的优先级低于点运算符
string s1 = "a string", *p = &s1;
auto n = s1.size(); //运行string对象s1的size成员
n = (*p).size(); //运行p所指对象的size成员
n = p->size(); //等价于(*p).size()
- 使用位运算符
- 移位运算符 满足左结合律
4.9 sizeof运算符
sizeof (type)
sizeof expr
4.10 逗号运算符
4.11 类型转换
- 隐式转换
- 算数转换
将运算对象转换为最宽的那种类型 - 整型提升
- 其他隐式转换
- 数组转换成指针
- 指针的转换
指向任意非常量的指针能转换成void*
指向任意对象的指针能转换成const void*
继承关系的类型间还有另外一种指针转换关系
- 转换成布尔类型
- 转换成常量
相反则不可以 - 类类型定义的转换
- 显示转换
cast 强制类型的转换- 命名的强制类型转换
cast-name<type>(expression)
cast-name 是static_cast、dynamic_cast、const_cast 和reinterpret_cast 中的一种,dynamic_cast支持运行是类型识别。
- static_cast
只要不包含底层const,都可以使用static_cast.- 对于讲一个较大的算数类型试图赋值给较小的类型,就会给出警告信息。但是我们执行了显示的类型换换后,警告信息就会被关闭。
- static_cast对于编译器无法自动执行类型转换也非常有用。找回存在void*指针中的值:
void *p = &d; //任何非常量对象的地址都能存入void* double *dp = static_cast<double*>(p); //将void* 转回初始的指针类型
- const_cast
const_cast只能改变运算底层const(表示指针所指的对象是一个常量,引用也是)
只有const_cast能改变表达式的常量属性,使用其他形式的命名强制类型转换改变表达式的常量属性都将引发编译错误。同样的,也不能用const_cast改变表达式的类型。const char *pc; char *p = const_cast<char*>(pc); //正确,但是通过p写值是未定义的行为
const_cast 常用于有函数重载的上下文中。const char *cp; char *q = static_cast<char*>(cp); // 错误,static_cast不能转换掉const性质 static_cast<string>(cp); /正确,字符串字面值改变为string类型 const_cast<string>(cp); //错误,const_cast只能改变常量属性
- reinterprest_cast
reinterprest_cast 通常为运算对象的位模式提供较低层次上的重新解释。
int *ip; char *pc = reinterprest_cast<char*>(ip); string str(pc); //可能运行时错误,pc存放的是指向int的指针
- 命名的强制类型转换
减少强制类型的转换的使用