C++中的强制类型转换

来源:互联网 发布:惠州网络英才网 编辑:程序博客网 时间:2024/06/13 05:52

C中的隐式类型转换和强制类型转换

void Test(){      int i = 1;      //隐式类型转换      double d = i;      printf("%d,%.2f\n", i, d);      int* p = &i;      //强制类型转换      int address = (int)p;      printf("%x,%d\n", p, address);}

C++中的强制类型转换。

static_cast; reinterpret_cast; const_cast ;dynamic_cast;

static_cast:
该运算符把expression转换成type-id类型,没有运行时类型检查来保护转换的安全性。
用于:

  1. 类层次结构中基类和派生类之间指针或引用的转换。

    向上转换(把派生类的指针或引用转换成基类表示)是安全的
    向下转换(把基类指针或引用转换成派生类表示)由于没有动态类型转换是不安全的。

  2. 用于基本数据类型之间的转换。

  3. 把空指针转换成目标类型的空指针
  4. 把任何类型的表达式转换成void类型

用法:
static_cast(expression);

1.C++中的static_cast执行非多态的转换,被作为显示类型转换使用。

int i;float = 166.71;i = static_cast<int>(f);

reinterpret_cast;
reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。
所谓“通常为操作数的位模式提供较底层的重新解释”也就是说将数据以二进制存在的形式重新解释。

reinterpret(重新解释)

void Test(){      int i;      char* p = "This is a Sample";      i = reinterpret_cast<int> (p);      cout << i << endl;}

const_cast
const_cast最常用的用途就是删除变量的const属性,方便赋值。

void Test(){      const int a = 3;      int *p = const_cast<int*>(&a);      *p = 5;      cout << a << endl;}

dynamic_cast
dynamic_cast用于将一个父类对象的指针(或引用)转换为
子类对象的指针或引用(动态转换)

向上转型:子类对象指针->父类指针/引用
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)

  1. dynamic_cast只能用于含有虚函数的类。
  2. dynamic_cast会先检查是否能转型成功,能成功则转换,不能则返回0.
class A{public:      virtual void f()      {}};class B{};void fun(A* Pa){      //B* pb1 = static_cast<B*>(Pa);      B* pb2 = dynamic_cast<B*> (Pa);      cout << "pb2" << pb2 << endl;}void Test(){      A a;      B b;      fun(&a);//    fun(&b);}

explicit关键字
explicit关键字阻止经过转换构造函数进行的隐式转换的发生。

class A{public:      explicit A(int a)      {            cout << "A(int a)" << endl;      }      A(const A& a)      {            cout << "A(const A&a)" << endl;      }private:      int _a;};void Test(){      A a1(4); //     A a2 = 1;   //不能执行通过}
原创粉丝点击