static_cast和dynamic_cast分别有什么用途,二者又有什么区别
时间: 2023-12-03 20:44:35 浏览: 65
`static_cast`和`dynamic_cast`是C++中的两种类型转换操作符,它们的用途和区别如下:
1. `static_cast`
静态转换,主要用于基本类型之间的转换,比如将`int`类型转换为`float`类型等。此外,也可以用于类层次结构中基类和子类之间的转换,但是这种转换需要满足以下两个条件:
- 子类对象的指针或引用可以隐式转换为基类对象的指针或引用。
- 基类对象的指针或引用必须明确转换为子类对象的指针或引用。
示例代码如下:
```c++
class Base {
public:
virtual void func() {}
};
class Derived : public Base {
public:
void func() override {}
};
int main() {
Base* b = new Derived();
Derived* d = static_cast<Derived*>(b); // 合法,向下转型
Base* b2 = static_cast<Base*>(d); // 合法,向上转型
return 0;
}
```
2. `dynamic_cast`
动态转换,主要用于类层次结构中基类和子类之间的转换,但是与`static_cast`不同的是,`dynamic_cast`会在运行时检查转换是否有效,如果无效则返回空指针或抛出异常(如果是引用类型则抛出`bad_cast`异常)。因此,`dynamic_cast`的安全性更高,但是也会带来一些性能损失。
示例代码如下:
```c++
class Base {
public:
virtual void func() {}
virtual ~Base() {}
};
class Derived : public Base {
public:
void func() override {}
};
int main() {
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 合法,向下转型
Base* b2 = dynamic_cast<Base*>(d); // 合法,向上转型
Derived* d2 = dynamic_cast<Derived*>(b2); // 不合法,返回空指针
return 0;
}
```
总的来说,`static_cast`用于基本类型之间的转换以及类层次结构中的向上转型和向下转型(需要满足条件),`dynamic_cast`用于类层次结构中的向上转型和向下转型,并且会在运行时检查转换是否有效。
阅读全文