隐式转换
显示转换
C++最新命名的强制类型转换形式如下:
cast-name <type> (expression);
type:是转换的目标类型,如果type是引用类型,则结果是左值;
expression:是要转换的值;
cast-name: static_cast、reinterpret_cast、reinterpret_cast和 dynamic_cast;
旧式的强制类型转换:
type(expression) 函数形式的强制类型转换
(type)expression c语言风格的强制类型转换
static_cast
任何具有明确定义的类型转换,不包含底层const(如const int* i=10;),都可以使用static_cast。
例如:1、可以将j转换为double类型,进行计算。不要忘记()
int j = 10; double slope = static_cast<double>(j) / 3;
2、将一个较大的算术类型赋值给较小的类型;
3、利用其找回存在于void*指针中的值:
double d = 20; void* p = &d; double* dp = static_cast<double*>(p); std::cout << *dp << std::endl;
当把指针存放在void*中,使用static_cast将其强制转换会原来的类型时,应该确保指针的值保持不变。即确保转换后的所得类型就是指针所指类型。(原值为int 就需要转换为 int*,原值为double就需要转换为 double*)
const_cast
const_cast只能用来改变预算对象的底层const。
double c = 3.14; const double* pc; pc = &c; *pc = 1.1; //不合法 double* p = const_cast<double*>(pc); *p =3.1415; std::cout << *p << std::endl;
常量转换为非常量的行为,称为“去掉const性质(cast away the const)”。一旦去掉了某个对象的const性质,编译器就不在组织我们对该对象进行写操作了。如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为。如果对象时常量,则会法生不确定行为。(不要这么干)
const_cast常常用于有函数重载的环境中。
reinterpret_cast
dynamic_cast