该博客用于记录自己在阅读过程中不懂的知识点,很少用到但比较重要的知识点以及模棱两可的知识点
赋值运算符满足右结合律
移位运算符满足左结合律
sizeofp; //指针所占空间大小
sizeof*p; //指针所指对象类型所占空间大小
sizeof返回一个常量表达式(可以用来声明数组维度)
隐式转换
宏观理解:隐式转换往更宽或更大的类型转换,赋值运算右边的 会往左边转换
bool,short,char等比int小的类型会先提升为int再运算
无符号和带符号运算,如果两类型相同则会转换为无符号,如 果不相同,则依赖于及其两运算对象存在包含与被包含关系,如 果其中无符号的所有值都被带符号的包含,则转换为带符号数, 否则转换为无符号的如:usignedint 和long都是4个字节,所以 转换为usignedint;
3.14L+ 'a'; //'a'先提升为int,再转换为double
其他类型隐式转换
大多使用数组的表达式中数组转换为指向首元素的指针
常量整数值0和nullptr可以转换为任意指针
指向任意非常量的指针都能转换为void*
指向任意对象的指针都能转换成constvoid*
转换成bool型
允许将非常量的指针和引用转换成相应常量类型的指针和引用
类类型的转换,如:
string s = “aaa”; //字面值转换为string类型
while(cin >> a) //cin转换为bool值
强制类型转换:
static_cast:
通常情况下使用该方式,例如
1.强制转换为double类型执行浮点除法
2.较大的算术类型转换为较小的算术类型(精度损失)
3.用于一些编译器无法自动执行的类型转换
void*p = &d;
double*rp = static_cast<double*>(p);
const_cast:
改变运算对象的底层const,只有它能改变表达式的const属性
constchar *p1;
char*p2 = const_cast<char *> (p1);
如果p1所指对象为一个常量,通过p2写值是不行的
reinterpret_cast
无关类型之间的转换,重新解释(IBM的C++指南、C++之父BjarneStroustrup的FAQ网页和MSDN的VisualC++也都指出:错误的使用reinterpret_cast很容 易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用 reinterpret_cast方式。IBM的C++指南、C++之父BjarneStroustrup的FAQ网页和MSDN 的VisualC++也都指出:错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换 后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。)所以该转换 常和hash配合使用