C++ 类型转换
C++ 提供了四种类型转换运算符,每种都有其特定的用途和转换方式。这些运算符利用模板技术实现,以支持不同的数据类型和转换场景。
1. 静态类型转换:static_cast<>()
概念:static_cast
是在编译时执行的类型转换,用于非多态类型转换,它不会进行运行时类型检查。
原理:它基于编译器的知识,不涉及运行时类型信息(RTTI)。
用法:适用于基本数据类型之间的转换,如整数提升、浮点数转换为整数等,以及类层次结构中向上转型(从派生类指针转换为基类指针)。
案例代码:
class Base { virtual void func() {} };
class Derived : public Base {};
int main() {
Derived d;
Base* b = static_cast<Base*>(&d); // 向上转型,从 Derived* 转换为 Base*
int i = 10;
float f = static_cast<float>(i); // 将 int 转换为 float
return 0;
}
2. 动态类型转换:dynamic_cast<>()
概念:dynamic_cast
是在运行时执行的类型转换,用于类层次结构中的向下转型(从基类指针转换为派生类指针)。
原理:它使用运行时类型信息(RTTI)来检查转换的安全性。
用法:只有当转换是合法的,即对象实际上是目标类型时,转换才会成功。
案例代码:
class Base { virtual void func() {} };
class Derived : public Base {};
int main() {
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 安全的向下转型
if (d) {
d->func();
} else {
cout << "Conversion failed" << endl;
}
delete b;
return 0;
}
3. 重新解释类型:reinterpret_cast<>()
概念:reinterpret_cast
用于将任何指针类型转换为任何其他指针类型,包括将指针转换为足够大的整数类型,反之亦然。
原理:它提供了一种低级别的转换,不进行任何类型的检查。
用法:适用于需要重新解释数据的情况,如处理函数指针、硬件地址等。
案例代码:
int main() {
int a = 65; // 'a' is an integer
int* b = reinterpret_cast<int*>(&a); // 将整数的地址转换为整数指针
cout << *b << endl; // 输出 65
return 0;
}
4. 常类型转换(脱去const属性):const_cast<>()
概念:const_cast
用于移除或添加const
或volatile
属性。
原理:它不改变表达式的值类型,只改变其值类别。
用法:适用于需要修改被声明为const
的对象的情况。
案例代码:
void modifyConst(char* p) {
*p = 'a'; // 错误:p 是 const char*
const_cast<char*>(p)[0] = 'a'; // 正确:移除 const 属性
}
int main() {
const char* str = "Hello";
modifyConst(const_cast<char*>(str));
cout << str << endl; // 输出 'aello'
return 0;
}
这些类型转换运算符提供了强大的控制能力,允许开发者在不同场景下进行精确的类型转换。然而,它们也应谨慎使用,以避免潜在的类型安全问题。
作者:
hwaityd
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。