读书笔记:C++ Primer系列(12)—— 类型转换

题记:类型转换就是将给定类型的表达式转换为另一种类型。C++中的转型可分为两种:隐式类型转换和显式类型转换。

隐式转换

隐式转换不需要任何转换运算符,编译器会自动根据类型兼容性进行不同类型之间的转换。一般情况下,在C/C++中这种转换多出现在基本数值类型上,其基本原则就是所需内存小的类型可以直接转换成内存大相同的或者。

例如:

int a=0;

a=3.1415+3;

运行结果为:6

解释:

  上述加法操作中,其操作数是两个不同类型的值:3.1415是double类型的字面值常量,3是int类型的字面值常量。C++并不是把两个不同类型的值直接相加,而是要通过转换为同一种数据类型后再相加。

  C++定义了算术类型之间的内置转换以尽可能防止精度损失,通常,如果表达式含有整型和浮点型,则将整型操作数转换为浮点型。上例中,整数3被转换为double类型后,执行浮点类型的加法操作,得double类型的结果6.1415,最后将double类型的值赋给整型变量a。double类型向int类型转换自动按截尾形式进行,舍弃小数部分。

显式转换——强制类型转换

首先,C++什么时候需要实现强制类型转换??

第一:在需要覆盖通常的标准转换的时候,常见于复合赋值,例如:

int a;

double b;

a *= b;

注解:上面程序的第三行是将int型的a先转换为double型,再与b相乘,然后将乘法的double型结果截尾,变成int型后赋给a。

         这里为了省掉“将int型的a先转换为double型”这个步骤,这时就可以通过强制类型转换来实现,方法为:a *= static_cast<int>(b);

第二:可能存在多种转换时,需要选择一种特定的类型进行转换

其次,C++强制类型转换符号是什么?强制类型转换的类别有哪些?

                               强制类型转换符号的一般形式为:cast-name<type>(expression);

其中:cast-name分别是static_cast、dynamic_cast、const_cast、reinterpret_cast即4中强制转换类型;type表示转换的目标类型;expression表示被强制转换的值。

第一:static_cast。一般用于执行非多态的转换,用于编译器隐式执行的任何类型转换,即上述任何隐式转换都可以用static_cast显式来完成。

第二:dynamic_cast。用于支持运行时识别指针或引用所指向的对象。(区别于其他强制类型转换的是:dynamic_cast涉及运行时类型检查)

注意:

  • dynamic_cast主要将基类类型的指针或引用安全的转换为派生类类型的指针或引用。
  • 在上述的一般形式中,type必须是类的指针、类的引用或者void*。
  • 如果type是一个类指针类型,expression也必须是一个指针,如果type是一个引用,expression也必须是一个引用。
  • 如果转换到指针类型的dynamic_cast失败,则dynamic_cast的结果为0值;如果转换到引用类型的dynamic_cast失败,则会抛出一个bad_cast类型的异常。

 例如:

     假定Bsae是至少带有一个虚函数的类。而Derived是Base的一个派生类,乳沟指针basePtr指向Base,则可以使用dynamic_cast将其强制转换为指向Derived的指针。

if(Derived *deriverPtr = dynamic_cast<Derived*>(basePtr))

{

}

else

{

}

第三:const_cast。转换掉表达式的const性质

  • 常量指针被转化成非常量指针,并且仍然指向原来的对象;
  • 常量引用被转换成非常量引用,并且仍然指向原来的对象;
  • 常量对象被转换成非常量对象。

第四:reinterpret_cas修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。

例如:

      int *n= new int ;

  double *d=reinterpret_cast<double*> (n);

在进行计算以后, d 包含无用值。这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析。

再如:

     int *ip;

     char *ptr = reinterpret_cast<char*>(ip);

这里必须要记得ptr指向的真实对象是int型,而并非字符数组,因此不能将pc用作普通字符指针。

原文地址:https://www.cnblogs.com/kkdd-2013/p/3699523.html