[C++学习01]强制类型转换和volatile关键字

本篇作为C++学习的开篇之作,主要讲解一下C++中的4种强制类型转换和volatile关键字,其中主要参考了以下一些网上资源:
1. C++显式类型转换示例详解
2. C++中的显式类型转换

强制类型转换

  1. static_cast:

    • 静态类型转换符
    • 仅仅在编译程序时静态地检查类型强制转换,执行程序时不再进行检查转换是否安全。一般有以下几种类型:
      1.基本数据类型的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要由程序员来保证。
      2.将空指针(0)转换成目标指针类型。
      3.完成任何类型的指针与void之间的转换。
      4.用于类层次结构中基类和子类之间指针或引用的转换。
      进行向上转换(把子类的指针或引用转换成基类表示)是安全的(向上转换一般都是隐式转换,没有必要使用静态类型转换);
      进行向下转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的
    • example
      int i ;
      long ii = static_cast<long>(i);
      float iii = static_cast<float>(i);
  2. dynamic_cast:

    • 动态类型转换符
    • 与static_cast相对,是动态dynamic_cast转换。这种转换是在运行时进行转换分析的,并非在编译时进行。
    • 只能在继承类对象的指针之间或引用之间进行类型转换。进行转换时,会根据当前RTTI(Run-Time Type Information)判断类型对象之间的转换是否合法。
    • 当使用dynamic_cast尝试进行指针的非法转换时,指针的值会被赋成0。
    • 当这个非法转换是针对引用而进行时,C++会抛出一个bad_cast异常来通知这个错误。
    • 将继承类指针或引用转换为基类指针或引用可以,反过来一般不行; 但是如果基类中有虚函数也可以,也就是说被转换的类具有虚函数的对象指针时,编译也通过。
    • example
      class Base();
      class Derived : public Base{}
      Derived *pd = new Derived;
      Base *d = dynamic_cast(pd);
  3. const_cast:

    • 常类型转换符
    • 常类型转换const_cast用来修改类型的const或volatile属性。
    • 可以将const类型转换为非const,也可以将非const转换为const;
    • 可以将volatile转换成非volatile,也可以将非volatile转换成volatile。
    • 除了const 或volatile修饰之外,其操作对象的类型和目标类型必须是一样的。
    • example
      const int* pci=0;
      int* pj=const_cast<int*>(pci);
  4. reinterpret_cast:

    • 再解释类型转换符
    • 该操作符用于将一种类型转换为另一种不同的类型,比如可以把一个整型转换为一个指针,或把一个指针转换 为一个整型。
    • 使用该操作符的危险性较高,一般不应使用该操作符。
    • example
      double d = 9.3;
      double *pd = &d;
      int *pi = reinterpret_cast<int*>(pd);
      //或者
      class A{}
      A a;
      int x = reinterpret_cast(a);

volatile关键字

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存

具体可以参考:
C/C++中volatile关键字详解
以及
C++中的关键字 volatile 详解

你可能感兴趣的:(C++学习,c++)