目录
对《C++primer》5做点笔记:
强制转换的形式:
cast-name<type>(expression);
其中type是转换的目标类型而expression是要转换的值。如果type是引用类型,则结果是左值。cast-name是static_cast,dynamic_cast,const_cast和reinterpret_cast中的一种。dynamic_cast支持运行时类型识别(原书P730)。cast-name指定了执行的是哪种转换。
四种强制转换类型
static_cast:
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast
例如:
int i,j;
double slope = static_cast<double>(j)/i;
原来没有强转的时候,编译器可能会告诉我们这里会有潜在的精度损失,但是此时用强转类型告诉编译器我们不在乎这点损失
static_cast对于编译器无法自动执行的类型转换也很有用,我们可以用static_cast找回存在于void*(原书50页)指针中的值,栗子:
void *p = &d;
double *dp = static_cast<double*>p;
这里复习一下void*以及顶层const,底const:
void*:
void*是一种特殊的指针类型,可用于存放任意对象的地址。
void*能做的事情:
1.拿他和别的指针作比较
2.作为函数的输入或输出
3.赋给另外一个void*指针
void*不能干的事情:不能直接操作void*所指的对象,因为我们并不知道他指向的对象的类型,也就无法确定能有哪些操作。
顶层const和底层const:
我的理解是:顶层表示某个对象本身是常量,底层表示指向的对象是一个常量
举个栗子:
int i=0;
int *const p1=&i; //指针本身是个常量,顶层const
const int ci=42; //不能改变ci的值,顶层const
const int *p2=&ci; //允许改变p2的值,指向的对象是个常量,底层const
const_cast:
const_cast只能改变运算对象的底层const
const char *pc;
char *p=const_cast<char*>(pc);
对于将常量对象转换成非常量对象的行为,我们一般称其为“去掉const性质”。
但是要注意:如果对象本身不是一个变量,使用强制类型转换获得写权限是合法的行为。然而如果对象是一个常量,再使用const_cast去获得写操作就会产生未定义的后果。
只有const_cast能改变表达式的常量属性,使用其他形式的命名强制类型转换改变表达式的常量属性都将引发编译器错误。同样,也不能用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只改变常量类型
reinterpret_cast:
通常为运算对象的位模式提供较低层次上的重新解释。
把运算对象的内容解释成另外一种类型。这种强制类型转换本质上依赖于机器而且非常危险。
dynamic_cast:
看到了再写