C++中4种类型转换

来源:互联网 发布:数据库精品课程 王珊 编辑:程序博客网 时间:2024/04/29 04:17

先看下c和cpp类型转换的区别:

C风格和函数风格的显式转换视情况由下面第一个匹配的C++风格显式转换构成:


— a const_cast,
— a static_cast,
— a static_cast followed by a const_cast,
— a reinterpret_cast or
— a reinterpret_cast followed by a const_cast


C++转换的优势就是从字面上能够看出你这个转换的底层含义或潜在的风险,C的转换“看上去”是无差别的;
对于实际工作中,最简单的处理方式是禁止使用“不安全”的转换,这样的话即便全用C的转换也是比较安全的;
实际上,当你使用const_cast的时候90%意味着你的接口设计或代码实现不合理,当你用dynamic_cast的时候已经步入了C++不提倡的rtti领域,在你去使用这些转换之前,首先应该想到的是尽量避免他们的出现。


1.static_cast<type>(var)

转换类型覆盖了C语言中所有的强制隐式转换,以及部分这样的转换的反向转换(例如,void* 指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个 const 对象转型为 non-const 对象(只有 const_cast 能做到),它最接近于C-style的转换。

用于基本的数据类型转换(char,int),及指针之间的转换。

2.dynamic_cast

主要用于父类和子类之间的转换,与其他3种不同的是无法在编译期间知道是否能够转换成功。

当用于子类指针转换为父类指针时,与static_cast一致,而当用于父类指针转换为子类指针时,首先必须要求父类中存在虚函数,否则在编译期间就会报错,要求必须有虚函数的原因是因为dynamic_cast要利用虚函数表来获得父类信息。当转换失败时返回空指针(static_cast不做检测,危险)。

3.reinterpret_cast

这种应该就是内存里的数据不变(同一个二进制数),根据转换的类型重新解释,可以把指针转换为整形数,一般比较少见。

4.const_cast

把const类型转换为非const类型。

class C{public:int a;C(int val) { a = val; }};const C* pt1= new C(3);C* pt2 = const_cast<C*>(pt1);pt2->a = 4;cout << "pt1->a="<<pt1->a<<" pt2->a=" << pt2->a;delete pt1;

输出结果都是4,说明解除const成功。

另附引用const:

int n = 0;const int & m = n;const short &l = n;n = 8;cout << n << m << l;
输出结果为8 8 0

参考:

比较C++中的4种类型转换方式

static_cast与dynamic_cast转换

C++标准转换运算符reinterpret_cast



0 0
原创粉丝点击