强制类型转换
以前学过关于类型转换的方法,今天用了几个类,自己做了一下。
普通类型转换:int(x) (int)x 如果A是一个类应该只能用(A)x,不能区分风险的高低
1. static_cast
static_cast用来进行比较自然和低风险的转换,比如整型和实数型,字符型之间的转换
static_cast不能用来在不同类型的指针之间互相转换,也不能用于整型和指针之间的互相转换,也不能用于不同类型的引用之间的转换
class A{
public:
operator int() {return 1;} //类型转换运算符重载不用写返回值类型
operator char*() {return NULL;}
}
int a;
a=static_cast<int>(3.14);
char*p="acd";
p=static_cast<char*>(a);
2. reinterpret_cast
reinterpret_cast用来进行各种不同类型的指针之间的转换,不同类型的引用之间的转换,以及指针和能容纳得下指针的整数类型的转换。转换的时候执行的是逐个比特拷贝的操作。
#include <iostream>
class A
{
public:
int i;
int j;
A(int n):i(n),j(n){}
};
int main(){
A a(100);
int & r=reinterpret_cast<int&>(a);
r=200; //这时a.i=200,a.j=100;
int n=300;
A* pa=reinterpret_cast<A*>(&n); //强行让pa指向n
pa->i=400; //将n变为400
pa->j=500; //这能导致出错
}
3. const_cast
用来进行去除const属性的转换,将const引用转换成同类型的非const引用,将const指针转换为同类型的非const指针
const string s="Inception";
string & p=const_cast<string&>(s);
string * ps=const_cast<string*>(&s); //能用p和指针修改s的内容
4. dynamic_cast
dynamic_cast专门用于将多态基类的指针或引用,强制转换为派生类的指针或引用,而且能检查转换的安全性。对于不安全的指针转换,转换结果返回NULL指针,如果是不安全的引用转换抛出bad_cast异常。
dynamic_cast不能用于将非多态基类的指针或引用,强制转换为派生类的指针或引用
如果该基类指针真的指向派生类对象,转化就是安全的
class Base{
public:
virtual ~Base(){}
};
class Derived:public Base{};
int main(){
Base b;
Derived d;
Derived *pd;
pd=reinterpret_cast<Derived*>(&b); //这没办法判断安全性,一定成功
pd=dynamic_cast<Derived*>(&b); //这为NULL
Derived & r =dynamic_cast<Derived&>(b); //能通过抛出异常判断安全
}