static_cast:
可以将值从一种数据类型转换到另一种数据类型
例:
int i;
Char c = static_cast<char> (i);
*当 static_cast<type> (value)中type 和value所属类型可以隐式转换时(单向即可),本转换才是合法的。
其他的 3个,如果type放的不是 指针 或者引用的话,就会报错(VS)。
dynamic_cast:
将基类类型的指针或者引用安全的转换为派生类类型的指针或者引用 (vs中type必须为动态的)
运行时类型识别:RTTI
有虚函数的情况 :运行时
没有虚函数的情况: 编译时,静态(VS中编译就不过)
指针:
如果转换失败 则返回 0 即空指针
引用:
如果转换失败 则抛出 bad_cast 异常
reinterpret_case
用于天生危险的类型转换。
例:
structdat{short a; short b};
long value = 0x05A224B118;
Dat *pd = reinterpret_case<dat *>(&value);
Cout<<pd->a<<endl;
通常这种转换是适用于实现的底层编程技术。比如上例,在不同的大小端的环境中 运行结果是不同的。
注:它不支持所有的类型转换 ,比如:
1不允许删除count
2.不能将函数指针和数据指针之间转换
3.可以将指针类型转换成int但是不能转成更小的char或者浮点型。
const_cast:
由于编程中可能无意间同时改变类型和常量特征,因此使用const_cast更安全。
可以修改指向一个值的指针,但修改const值的结果是不确定的(C++标准指出这种行为是不确定的)
也就是修改 有可能成功,也有可能不成功。
intia = 10;
Const int ca = 100;
Void change(const int * pt ) {
int * pi = null;
pi = const_cast<int *>(pt);
*pi = 0;// const_cast
void main () {
Change(&ia);//0
Change(&ca);// 100}
//-------------------------------------------------------------
个人的理解,欢迎指正交流。如有转载,请注明出处。