C++强制转化

 

c++中强制类型转换操作符小结

标准c++中主要有四种强制转换类型运算符:
const_cast,reinterpret_cast,static_cast,dynamic_cast等等。

1)static_cast<T>(a)
将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。
表达式static_cast< T > ( a ) a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。

例子:

class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
    D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指针

    B* pb2 = static_cast<B*>(pd);        // 安全的
    ...
}

class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
    D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指针

    B* pb2 = static_cast<B*>(pd);        // 安全的
    ...
}

class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
    D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指针

    B* pb2 = static_cast<B*>(pd);        // 安全的
    ...
}

2)dynamic_cast<T>(a)
完成类层次结构中的提升。T必须是一个指针、引用或无类型的指针。a必须是决定一个指针或引用的表达式。
表达式dynamic_cast< T >( a ) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针。

例子:
class A { ... };
class B { ... };
void f()
{
   A* pa = new A;
   B* pb = new B;
   void* pv = dynamic_cast<void*>(pa);
   // pv 现在指向了一个类型为A的对象
   ...
   pv = dynamic_cast<void*>(pb);
   // pv 现在指向了一个类型为B的对象
}

3)const_cast<T>(a)
去掉类型中的常量,除了const或不稳定的变址数,T和a必须是相同的类型。
表达式const_cast< T >( a )被用于从一个类中去除以下这些属性:const, volatile, 和 __unaligned。

例子:

class A { ... };
void f()
{
  const A *pa = new A;//const对象
  A *pb;//非const对象

//pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象
  pb = const_cast<A*>(pa); // 现在OK了
...
}

class A { ... };
void f()
{
  const A *pa = new A;//const对象
  A *pb;//非const对象

//pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象
  pb = const_cast<A*>(pa); // 现在OK了
...
}

class A { ... };
void f()
{
  const A *pa = new A;//const对象
  A *pb;//非const对象

//pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象
  pb = const_cast<A*>(pa); // 现在OK了
...
}

4)reinterpret_cast<T>(a)
任何指针都可以转换成其它类型的指针,T必须是一个指针、引用、算术类型、指向函数的指针或指向一个类成员的指针。
表达式reinterpret_cast< T >( a )能够用于诸如char* 到 int*,或者One_class* 到 Unrelated_class*等类似这样的转换,因此可能是不安全的。

例子:
class A { ... };
class B { ... };
void f()
{
   A* pa = new A;
   void* pv = reinterpret_cast<B*>(pa);
   // pv 现在指向了一个类型为B的对象,这可能是不安全的
   ...
}

本文引用通告地址: http://blog.youkuaiyun.com/hitjinming/services/trackbacks/428633.aspx


### C++ 强制类型转换概述 C++ 提供了四种类型的强制类型转换操作符,分别是 `static_cast`、`const_cast`、`reinterpret_cast` 和 `dynamic_cast`。每种类型转换都有其特定的应用场景和语法规则。 --- #### 1. **`static_cast` 的使用方法** `static_cast` 是一种通用的类型转换方式,主要用于兼容编译器可以隐式完成的类型转换[^1]。它适用于以下情况: - 基本数据类型之间的转换(如 int 转 float) - 枚举类型到整数类型的转换 - 指针或引用在继承层次结构中的向上转型 ##### 示例代码: ```cpp #include <iostream> using namespace std; int main() { double d = 3.14; int i = static_cast<int>(d); // 将 double 类型转为 int 类型 cout << "i: " << i << endl; void* ptr = new int(10); int* p = static_cast<int*>(ptr); // 将 void* 转换为具体指针类型 cout << "*p: " << *p << endl; delete p; return 0; } ``` --- #### 2. **`const_cast` 的使用方法** `const_cast` 主要用于移除变量的 `const` 或 `volatile` 属性[^2]。需要注意的是,如果尝试修改原本声明为 `const` 的对象,则会导致未定义行为。 ##### 示例代码: ```cpp #include <iostream> using namespace std; void modify(int* p) { (*p)++; } int main() { const int a = 10; int* b = const_cast<int*>(&a); // 移除常量属性 modify(b); cout << "Modified value of 'b': " << *b << endl; // 输出可能不一致,因为原对象是 const return 0; } ``` --- #### 3. **`dynamic_cast` 的使用方法** `dynamic_cast` 主要在多态情况下用于安全地执行向下转型(downcasting)。只有当基类具有虚函数时才能生效,并且运行时会检查转换的有效性。如果失败,在指针上返回 `nullptr`;对于引用抛出异常。 ##### 示例代码: ```cpp class Base { public: virtual ~Base() {} }; class Derived : public Base {}; int main() { Base* basePtr = new Derived(); Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); if (derivedPtr != nullptr) { cout << "Dynamic cast succeeded!" << endl; } else { cout << "Dynamic cast failed." << endl; } delete basePtr; return 0; } ``` --- #### 4. **`reinterpret_cast` 的使用方法** `reinterpret_cast` 实现低级重新解释位模式的功能,通常用来将一个指针类型转换成另一个完全无关的指针类型或者整数类型。这种转换非常危险,应谨慎使用。 ##### 示例代码: ```cpp #include <iostream> using namespace std; int main() { int num = 42; void* vptr = &num; long rawMemory = reinterpret_cast<long>(vptr); // 把地址当作原始内存处理 cout << "Raw memory address as integer: " << rawMemory << endl; return 0; } ``` --- ### 总结 以上介绍了 C++ 中四种主要的强制类型转换及其典型应用场景。合理选用这些工具能够帮助开发者更精确地控制程序的行为,但也需注意滥用可能导致难以调试的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值