C++零基础教程(新式类型转换)
@TOC
前言
本篇文章我们来讲解C++中的新式类型转换,在C语言中遇到类型转换我们一般使用强制类型转换,但是这种转换的方式是不安全的,可能会导致截断的发生,C++引入的新式类型转换解决了这个问题。
C++中的新式类型转换是一种更加安全和灵活的类型转换方法,它提供了四种不同的转换操作符,分别是static_cast、dynamic_cast、reinterpret_cast和const_cast。每种转换操作符都有其特定的用途和限制。
一、static_cast
static_cast用于基本类型之间的转换,以及非多态类型的转换,如指针或引用的类型转换。它具有以下特点:
用于常见的转换操作,如数值类型之间的转换、隐式转换和父子类之间的指针或引用转换。
// 数值类型之间的转换
int num = 10;
double convertedNum = static_cast<double>(num);
// 父子类之间的指针转换
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
void foo() {
cout << "Derived::foo()" << endl;
}
};
Base* basePtr = new Derived();
Derived* derivedPtr = static_cast<Derived*>(basePtr);
derivedPtr->foo();
二、dynamic_cast
dynamic_cast主要用于多态类型之间的转换,即在类继承关系中进行转换。它具有以下特点:
用于在继承关系中的指针或引用之间进行转换,并进行运行时类型检查。如果转换合法,返回目标类型的指针或引用;如果转换不合法,返回nullptr或引发std::bad_cast异常。
只能用于具有虚函数的类的转换,即运行时类型识别(RTTI)可用的类。
对于指针类型,如果指针为nullptr,转换结果也为nullptr。
转换操作开销较大,涉及动态类型信息查询和检查。
// 多态类型之间的转换
class Base {
public:
virtual ~Base() {}
virtual void foo() {
cout << "Base::foo()" << endl;
}
};
class Derived : public Base {
public:
void foo() {
cout << "Derived::foo()" << endl;
}
};
Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr != nullptr) {
derivedPtr->foo();
} else {
cout << "Dynamic Cast failed." << endl;
}
三、reinterpret_cast
reinterpret_cast用于进行低层次的类型转换,它几乎可以将任何指针或整数类型转换为任意其他类型。它具有以下特点:
用于执行与指针无关的类型之间的转换,如指针和整数之间的转换,以及指针类型之间的转换。
不进行类型检查,提供了最大的灵活性,但也潜在地破坏了类型系统和安全性。
在正常情况下,应避免使用reinterpret_cast,因为它可能导致未定义的行为。
// 指针和整数类型之间的转换
int num = 10;
int* numPtr = #
uintptr_t address = reinterpret_cast<uintptr_t>(numPtr);
cout << "Address: " << address << endl;
int* restoredPtr = reinterpret_cast<int*>(address);
cout << "Restored Value: " << *restoredPtr << endl;
四、const_cast
const_cast用于添加或删除指针或引用的const属性。它具有以下特点:
主要用于处理const和非const之间的转换,以提供对常量对象的非常量访问或对非常量对象的常量访问。
不能用于转换掉对象的const属性,这样的转换是未定义行为。
改变了类型修饰符,但不能执行实际的对象或值的转换。
// 添加或删除const属性
const int num = 10;
int& numRef = const_cast<int&>(num); // 移除const属性
numRef = 20;
const int* constPtr = #
int* mutablePtr = const_cast<int*>(constPtr); // 移除const属性
*mutablePtr = 30;
cout << "Modified num: " << num << endl; // 输出为20
总结
本篇文章就讲解到这里,新式类型转换大家必须掌握好。
- 点赞
- 收藏
- 关注作者
评论(0)