static_cast
用来完成编译器认可的隐式类型转换。
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
范围:
- 基本数据类型之间的转换。
- 派生体系中向上转型:将派生类指针或引用转化为基类指针或引用。
- 任意类型指针与void*之间的转换。
1 2 |
int a = 1; double b = static_cast<double>(a); |
1 2 3 4 5 6 7 8 9 10 11 |
class base { //something }; class derived : public base { //something }; base * b = nullptr; derived * d = new derived(); b = static_cast<base*>(d); |
dynamic_cast
用来完成派生类指针或引用与基类指针或引用之间的转换。
特点:
- 其他三种都是在编译时完成的,dynamic_cast是在运行时处理的,运行时要进行运行时类型检查。
- 基类中要有虚函数,因为运行时类型检查的类型信息存在于虚函数表中,而有虚函数才会有虚函数表。
- 它可以实现向上转型或向下转型,前提是继承关系是public或protected。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//向上转型 class base { //something }; class derived : public base { //something }; int main() { base * pb = nullptr; derived * pd = new derived(); pb = dynamic_cast<base*>(pd); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//向下转型 class base { virtual void func() { //do something } }; class derived : public base { void func() { //do something } } int main() { base * pb = new base(); derived * pd = dynamic_cast<derived*>(pb); return 0; } |
reinterpret_cast
用于任意指针或引用之间的转换
它会产生一个新的值,这个值会与原始参数有完全相同的比特位。
- 指针类型 $\rightarrow$ 一个足够大的整数类型。
- 整数类型 || 枚举类型 $\rightarrow$ 指针类型。
- 指向函数的指针 $\rightarrow$ 另一个不同类型的指向函数的指针。
- 一个指向对象的指针 $\rightarrow$ 另一个不同类型的指向对象的指针。
- 一个指向类函数成员的指针 $\rightarrow$ 另一个不同类型的函数成员的指针。
- 一个指向类数据成员的指针 $\rightarrow$ 不同类型的数据成员的指针。
1 2 3 4 5 |
int sh(void * ptr) { auto temp = reinterpret_cast<int>(ptr); return temp; } |
const_cast
只能对指针或引用去除或添加const属性
不能用于不同类型之间的转换,只能改变同种类型的const属性
- 函数形参是一个非const引用,要传一个const引用给它,可以用const_cast去除实参的常量性
- 一个const对象,想调用该const对象里的非const函数,可以用const_cast去除对象的常量性
1 2 |
const char * cp; char * q = const_cast<char*>(cp); |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 51CTO:C++语言高级课程二08/08
- ♥ breakpad记述:Windows下静态库的编译使用03/15
- ♥ C++标准库_cfenv02/14
- ♥ 51CTO:Linux C++网络编程三08/16
- ♥ 51CTO:C++语言高级课程一08/07
- ♥ Soui三05/19