C++四种cast使用详细介绍
在C++中,我们常常需要进行类型转换。而其中一种方式就是使用C++中的cast,本文将详细介绍C++中的四种cast。
C++中的四种cast
C++中一共有四种cast,分别是static_cast、dynamic_cast、reinterpret_cast和const_cast。
static_cast
static_cast的使用场景包括:
- 基础类型的强制类型转换;
- 类的上行转型(派生类向基类转换);
- 父类指针转成子类指针(downcast)。
示例代码如下:
int i = 10;
double d = static_cast<double>(i); // 基础类型转换
class Base {
public:
virtual void print() {
std::cout << "This is Base." << std::endl;
}
};
class Derived : public Base {
public:
void print() override {
std::cout << "This is Derived." << std::endl;
}
};
Base* base = new Derived();
Derived* derived = static_cast<Derived*>(base); // 父类指针转子类指针
dynamic_cast
dynamic_cast主要用于运行时类型识别,即在类的继承结构中进行向下的类型转换(downcast),转换时会检查转换的安全性,如果转换不安全将返回nullptr。因此,dynamic_cast只能用于含有虚函数的类。
示例代码如下:
class Base {
public:
virtual void print() {
std::cout << "This is Base." << std::endl;
}
};
class Derived : public Base {
public:
void print() override {
std::cout << "This is Derived." << std::endl;
}
};
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base); // 父类指针转子类指针,运行时检查
if (derived != nullptr) {
derived->print();
} else {
std::cout << "dynamic_cast failed." << std::endl;
}
reinterpret_cast
reinterpret_cast用于将一个指针或引用转换为其它类型的指针或引用,甚至可以进行不同类型的指针之间的转换,因此使用必须非常小心。
示例代码如下:
int i = 10;
int* pi = &i;
double* pd = reinterpret_cast<double*>(pi); // 两个具有不同类型的指针之间的转换
const_cast
const_cast用于将常量指针或常量引用转换为非常量的指针或引用,可以去除类型的const属性,使其可以进行修改操作。
示例代码如下:
const int i = 10;
const int& ir = i;
int& ri = const_cast<int&>(ir); // 去除const属性
ri = 20;
std::cout << i << std::endl;
总结
- static_cast:用于基础类型转换和父指针转子指针;
- dynamic_cast:用于运行时类型识别,父类和子类指针的转换,并进行安全检查;
- reinterpret_cast:用于进行不同类型指针之间的转换;
- const_cast:用于去除类型的const属性,常量指针或常量引用转换为非常量指针或非常量引用。
需要注意的是,动态类型转换的几种方式中,dynamic_cast容易引起性能问题,const_cast包含了一定的潜在风险,建议慎重使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++四种cast使用详细介绍 - Python技术站