类型转换
- 一、类型转换
- 1、C语言
- 2、C++
- 3、注意
- 二、static_cast
- 1、介绍
- 2、示例
- 三、reinterpret_cast
- 1、介绍
- 2、示例代码
- 3、运行结果
- 四、const_cast
- 1、介绍
- 2、示例
- 五、dynamic_cast
- 1、介绍
- 2、示例代码
- 3、运行结果
- 六、RTTI
- 1、介绍
- 2、typeid
- (1)介绍
- (2)示例代码
- 3、decltype
一、类型转换
1、C语言
- C语言中的类型转换(Type Casting)是一种显式地将一种数据类型的值转换为另一种数据类型的操作。
- 类型转换可以是隐式和显式的。隐式类型转换是编译器自动进行的,而显式类型转换则需要程序员明确指定。显式类型转换也称为强制类型转换(Casting)。
- 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。
2、C++
- C++中提供了多种强制类型转换(显式类型转换)的方式,以适应不同的场景和需求。这些方式包括C风格的类型转换(虽然C++中不推荐使用)、static_cast、dynamic_cast、const_cast和reinterpret_cast。
- C风格的类型转换使用括号 (type)value 来实现,但这种方式在C++中被认为是不安全的,因为它不会进行类型检查(除了某些基本的检查,如将void*转换为其他指针类型)。因此,C++引入了更安全的类型转换操作符。
3、注意
二、static_cast
1、介绍
- static_cast用于非多态类型的转换(静态转换),即用于执行基本的、隐式的转换。
- 编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。
- 如将int转换为float,将基类指针转换为派生类指针(但要求这种转换是安全的,即基类指针确实指向了一个派生类对象)。如果这种转换是通过构造函数或转换函数定义的,它还可以用于类之间的转换。
2、示例
double a = static_cast<double>(10); // int 转换为 double
Derived* d = static_cast<Derived*>(basePtr); // 假设 basePtr 指向一个 Derived 对象
三、reinterpret_cast
1、介绍
- reinterpret_cast用于进行各种不安全的转换,如指针类型之间的转换(即使它们之间没有继承关系),或者指针和足够大的整数类型之间的转换。这种转换基本上只是告诉编译器以不同的方式解释内存中的位,而不进行任何类型的检查。
- 由于reinterpret_cast几乎不做任何检查,因此应谨慎使用,以避免类型不匹配或内存对齐问题。
2、示例代码
void test_reinterpret_cast()
{int i = 1;int* p1 = reinterpret_cast<int*>(i);int* p2 = (int*)i;int* intPtr = reinterpret_cast<int*>(0x12345678);cout << p1 << "\n" << p2 << "\n" << i << "\n" << intPtr << endl;
}
3、运行结果
四、const_cast
1、介绍
- const_cast用于去除类型(变量)的const或volatile属性,方便进行赋值操作。
2、示例
int x = 1;
const int* ptr = &x;
int* nonConstPtr = const_cast<int*>(ptr); // 去除 const 限定符
五、dynamic_cast
1、介绍
- dynamic_cast主要用于安全地将基类指针或引用转换为派生类指针或引用,并在转换失败时返回空指针(对于指针)或抛出异常(对于引用)。
- dynamic_cast只能用于包含虚函数的类之间的转换,因为它依赖于运行时类型信息(RTTI)。
2、示例代码
class Base
{
public:virtual void f(){}int _b = 1;
};class Derive :public Base
{
public:virtual void f(){}int _d = 2;
};void Func(Base* p)
{Derive* d = dynamic_cast<Derive*>(p);if (d){++d->_b;++d->_d;cout << d->_b << "\n" << d->_d << endl << endl;}else{cout << "转化失败" << endl << endl;}
}int main()
{Base b;Derive d;Func(&b);Func(&d);return 0;
}
3、运行结果
六、RTTI
1、介绍
- C++中的 RTTI(Run-Time Type Information,运行时类型信息)是一种机制,允许程序在运行时查询对象的类型信息。
- C++提供了三种 RTTI 机制,分别是dynamic_cast、 typeid和decltype。
2、typeid
(1)介绍
- typeid运算符用于在运行时获取一个表达式的类型信息。它返回一个type_info对象的引用,该对象包含了表达式的类型信息。
- typeid可以用于任何类型的表达式,但只有在表达式的类型在编译时未知时,例如,通过基类指针或引用指向的派生类对象时,它才在运行时查询类型信息。
(2)示例代码
class Base {
public: virtual ~Base() {} // 虚析构函数,确保多态
}; class Derived : public Base
{}; int main() { Base* basePtr = new Derived(); std::cout << typeid(*basePtr).name() << std::endl; // 输出 Derived 的类型名(可能是编译器特定的) delete basePtr; return 0;
}
3、decltype
- 参见C++11(一)。
本文到这里就结束了,如有错误或者不清楚的地方欢迎评论或者私信
创作不易,如果觉得博主写得不错,请点赞、收藏加关注支持一下💕💕💕