当编译出现如下的错误的时候:
- error: invalid conversion from ‘int*’ to ‘char*’
- error: cannot initialize a variable of type ‘const int’ with an rvalue of type ‘int’
我们就要思考如何正确的进行类型转化了。
static_cast基本用法
该转化对应于c语言中的类型转化,用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。
- 基本数据类型转换
- int转换成enum
- 基类和子类之间指针和引用的转换
1. 基本数据类型转化
在基本类型的转化中,c语言的转换方式依旧是可以适用的,但为了类型转化更加醒目,我们通常使用这种static_cast
的类型转化。
转化格式为
static_cast<转化后的类型>(转化的变量名)
,
int* n = NULL;
void* p = n; // c语言中的隐式转化
n = (int*)p; // c语言中的显示转化
n = static_cast<int*>(p); // c++中的类型转化
2. int转换成enum
和基本类型转化很相似,直接看转化的代码吧。
enum Week{
SUN,MON,TUE,WED,THU,FRI,SAT
};
Week day = static_cast<Week>(0);
3. 基类和子类之间指针和引用的转换
我们可以将基类和子类之间指针和引用的转换分为两种
- 上行转化:把子类的指针或引用转换成父类,这种转换是安全的(通常使用默认转换)
- 下行转化:把父类的指针或引用转换成子类,这种转换是不安全的,也需要程序员来保证(通常使用dynamic_cast)
- 所以我们不在此展示下行转化,可以直接在dynamic_cast部分进行学习
C++中的类型转换:dynamic_cast
相关代码如下:
class Base{
public:
virtual void Test(){ // virtual 多态
cout << "Base:" << __func__ << endl;
}
};
class Derive:public Base{
public:
void Test(){
cout << "Derive:" << __func__ << endl;
}
void Func(){
cout << "Derive:" << __func__ << endl;
}
};
int main(){
Derive d;
Base b = static_cast<Base>(d); // 也可以进行隐式转换:Base b = d;
b.Print();
// 引用
Base& fb = static_cast<Base&>(d); // 也可以进行隐式转换:Base& fb = d;
fb.Print();
// 指针
Base* pb = static_cast<Base*>(new Derive); // 也可以进行隐式转换:Base* pb = new Derive;
pb->Print();
}