C+ Primer第四章③
C++ Primer
第四章 表达式
类型转换
隐式类型转换
不需要你关心,编译器会帮你搞定:
int a = 3.5 + 3.6; //a=7
算术类型之间的隐式转换原则是尽量避免损失精度。 我的感觉是,隐式转换都很自然,我们之前也碰到过,只不过没提到这个概念,在这里我就不一一分析了,感觉不知道这个概念,就这么自然地用也挺好的,不过后面我觉得有必要提这个概念的地方我还是会说明的。
显式转换
有时我们希望显式地将对象强制转换成另外一种类型:
int i = 2, j = 1; double k = j / i;
虽然有时候不得不使用强制类型转换,但我们还是要尽量避免使用它 强制类型转换有四种,算四大天王吧。
1.static_cast
任何具有明确定义的类型转换,只要不包含底层const(所指对象为常量),都可以使用它:
double k = static_cast<double>(j) / i; //把j转换成double就行了
两种情况常用static_cast:
- 把一个较大的算术类型赋值给较小的类型,我们用static_cast相当于告诉编译器,我们不在乎精度损失。
- static_cast对于编译器无法自动执行的类型转换也很有用,什么意思呢?看代码:
void* p = &d; //任何非常量对象的地址都能存入void* double *dp = static_cast<double*>(p); //转换回来,成为double*
2.const_cast
作用只有一个,去除底层const,而且你只能用它来去除:const char *pc; //pc指向const char,是底层const char *p = const_cast<char*>(pc); //p是*char,去除了底层const
3.reinterpret_cast
建议不用,也用不着,要了解的自行百度。旧式强制类型转换
它在不同地方用起来跟前面三者都有相似的地方,是因地制宜的一个用法,要用到的时候去查一下就好了。int *pi; char *pc = (char*) pi;