c++ 4种类型转换

1. 常量转换(const_cast)。=》方便赋值

常量转换用于去掉表达式的const属性,使其变成非常量表达式,方便赋值。常量转换不能改变表达式的类型,只能改变const属性。示例代码:

const int a = 10;

int b = const_cast<int&>(a);

2. 静态转换(static_cast)。=》隐式自动类型转换

静态类型转换主要用于2种转换环境

2.1 C++内置类型的转换:

原有类型的自动类型转换,如short转int,int转double,向上转型等

不能转内置类型指针!!

2.2 当有继承关系存在时:(用于向上转型

如果使用static_cast 由子类向父类转型,向上转型,天然安全安全。

static_cast提供编译器认为安全的类型转换,例如在继承中,可以用派生类对象给基类对象赋值;

静态转换可以在编译时期完成,适用于具有继承关系的类或者指针类型之间的转换。静态转换会进行一些类型检查,但是不会进行运行时检查。如果类型无法转换,则会编译报错。

示例代码:

double d = 3.14;

int i = static_cast<int>(d);

c++ 4种类型转换_第1张图片

3、reinterpret_cast =》对应的是C语言中的显示类型转换,支持非相近类型的转换

C++还提供了reinterpret_cast用于任意类型的转换,即reinterpret_cast运算符允许将任意指针转换到其他指针类型,也允许做任意整数类型和任意指针类型之间的转换。转换时,执行的是逐个比特复制的操作。reinterpret中文意为“重新解释; 重新诠释;”。

reinpreter_cast (exp)

其中, reinterpret_cast后的尖括号中的type-id类型必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。

4、动态转换(dynamic_cast)。

类型转换:dynamic_cast(用于向下转型)

向下转型父类对象指针/引用  “转型为”  子类指针/引用;

父类对象指针/引用 ->子类指针/引用(用dynamic_cast转型是安全的)

要求:

 dynamic_cast只能用于父类含有虚函数的类(必须是多态,因为虚函数表内存了一个判断它是子类还是父类)

dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr

动态转换可以在运行时期完成,适用于具有继承关系的类或指针类型之间的转换。动态转换会进行类型检查,如果类型无法转换,则返回空指针(对于指针类型)或抛出bad_cast异常(对于引用类型)。

示例代码:

class Base { virtual void foo() {} };

class Derived : public Base {};

Base* ptr = new Derived;

Derived* dptr = dynamic_cast<Derived*>(ptr);

if (dptr != nullptr) {

    // 转换成功

} else {

    // 转换失败

}

另注意:

向上转型是指:子类对象指针/引用 -> 父类指针/引用(不需要转换,赋值兼容规则)

你可能感兴趣的:(c/c++,c++)