本篇作为C++学习的开篇之作,主要讲解一下C++中的4种强制类型转换和volatile关键字,其中主要参考了以下一些网上资源: 1. C++显式类型转换示例详解 2. C++中的显式类型转换
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);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<Base*>(pd);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);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 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存
具体可以参考: C/C++中volatile关键字详解 以及 C++中的关键字 volatile 详解