1.static_cast
- 用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。
主要有如下:
- 基本数据类型转换
- int转换成enum
- 基类和子类之间指针和引用的转换
- int转换成char
int n = 97;
cout << n << '\t' << (char)n << '\t' << static_cast<char>(n) << endl;
- int转换成enum
enum Week{
SUN,MON,TUE,WED,THU,FRI,SAT
};
Week day = 0;
编译上述代码出现错误,把代码Week day = 0;改为Week day = static_cast(0);可以消除上面的错误。
2. const_cast
- const_cast主要作用是移除类型的const属性
- 常量指针被转化成非常量的指针,并且仍然指向原来的对象;
- 常量引用被转换成非常量的引用,并且仍然指向原来的对象;
const int a = 10;
// 指针
const int* cp = &a;
int* p = cp;//编译错误 error: invalid conversion from ‘const int*’ to ‘int*’
int* p = const_cast<int *>(cp); //正确写法
// 引用
const int& cf = a;
int& f = cf;//编译错误 error: binding ‘const int’ to reference of type ‘int&’ discards qualifiers
int& f = const_cast<int &>(cp); //正确写法
成员函数后缀const : 不能更改成员变量 (即this指针是const)
解决方法1:如果想要更改值则可以用const_cast<int&>(xxx)
解决方法2: 在成员变量前加 mutable;
3. dynamic_cast
- 用于类的指针、类的引用或者void *转化。
- 上行转换,把子类的指针或引用转换成父类,与static_cast相同。
- 下行转换,把父类的指针或引用转换成子类,比static_cast安全。
- 交叉转换,兄弟之间指针转换,static_cast会出现编译错误。
如果是指针,进行正确的转换,获得对应的值;否则返回NULL,如果是引用,则在运行时就会抛出异常;
#include <iostream>
using namespace std;
class Base {
public:
void Print() { cout << "Base" << endl; }
virtual ~Base(){}
};
class Derive : public Base {
public:
void Print() { cout << "Derive" << endl; }
};
int main() {
Base * pB = new Derive;
pB->Print();
Derive *pD = dynamic_cast<Derive*>(pB);
pD->Print();
}
dynamic_cast(xxx) 有效前提:父类实现了多态(必须存在一个任意的虚函数)
4.reinterpret_cast
- 修改了操作数类型,重新解释了给出的对象的比特模型而没有进行二进制转换。
主要用于以下六种情况:
- 从指针类型到一个足够大的整数类型
- 从整数类型或者枚举类型到指针类型
- 从一个指向函数的指针到另一个不同类型的指向函数的指针
- 从一个指向对象的指针到另一个不同类型的指向对象的指针
- 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
- 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针
static_cast: 实现传统的小括号转化功能;
const_cast: 移除变量const限定;
dynamic_cast: 多态父类指针/引用转化成子类指针/引用;
reinterpret_cast: 万能强制类型转换;