C++强制类型转换

来源:互联网 发布:淘宝网婴儿用品 编辑:程序博客网 时间:2024/06/02 03:20
强制类型转换分为4种:
reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)

使用目的:
reinterpret_cast:特意用于底层的强制转换,导致实现依赖(不可移植)的结果。这样的强制转化在底层代码以外应该极为罕见。用于进行没有任何关联之间的转换,比如将一个字符指针转换为一个整形数。
dynamic_cast:主要用于执行“安全的向下转型”,也就是说,要确定一个对象是否是一个集成体系中的一个特定类型。它是唯一一个不能用旧风格语法执行的强制转型,也是唯一一个可能有重大运行时代价的强制转型。通常在基类和派生类之间转换时使用。
static_cast:用于被强制隐形转换(如non-const对象转型为const对象,int转型为double等等),还可以用于很多这样的转换的反向转换(如void*指针转型为有类型指针,基类指针转型为派生类指针),不能将const对象转型为non-const对象。如果涉及到类的话,只能在相互联系的类型中进行相互转换,不一定包含虚函数。
const_cast:用于强制消除对象的常量性,唯一能做到这一点的C++风格的强制转型。主要针对const和volatile的转换。

具体分析:
1.reinterpret_cast<new_type>(expression)
在编译期处理
转换一个指针为其他类型的指针。
允许从一个指针转换为整形类型,反之亦然。
能够在非相关的类型之间转换,在类型指向的内容不做任何类型的检查和转换,可能是不安全的。

代码如下:
class CA
{
};
class CC
{
};
int main()
{
CA* a = new CA;
CC* c;
c = reinterpret_cast<CC*>(a); // 没错误,可能不安全
return 0;
}

2.dynamic_cast<new_type>(expression)
在运行期处理,会检查这个转换是否可能
只用于对象的指针和引用
不仅仅像static_cast那样会检查前后的两个指针是否属于同一个继承树,还会检查被指针引用的对象的实际类型用于确定转换是否可行,如果不可行,转换失败,返回空指针(NULL),如果可行,返回一个新指针。
代码如下:
class CA
{
virtual void test()
{
}
};

class CB : public CA
{
};
int main()
{
CA* a = new CA;
CA* d = new CB;
CB* b1 = dynamic_cast<CB*>(a); // 失败。返回NULL
CB* b2 = dynamic_cast<CB*>(d); // 成功
return 0;
}

3.static_cast<new_type>(expression)
在编译期处理
必须是指针、引用、算术类型或枚举类型
代码如下:
class CA
{
};
class CB : public CA
{
};
class CC
{
};
int main()
{
CA* a = new CA;
CB* b = new CB;
CC* c = new CC;

CB* b2 = static_cast<CB*>(a); //不安全,b2只是CA的一个指针
CA* a2 = static_cast<CA*>(b);
//CC* c2 = static_cast<CC*>(a); //error:错误,转换类型无效
return 0;
}

4.const_cast<new_type>(expression)
在编译期处理
改变一个对象的const、volatile属性
其它三个操作符都不能修改一个对象的常量性
代码如下:
class CA
{
};
int main()
{
const CA* a = new CA;
CA* b;
//b = a; //error:不能将const对象指针赋值给非const对象
b = const_cast<CA*>(a);
return 0;
}
0 0
原创粉丝点击