c++中强制类型转换方法有哪些

  介绍

小编给大家分享一下c++中强制类型转换方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

<强> C中的类型转换:

事情要从头说起,这个头就是C语言。我们已经习惯了使用C类型转换,因为它强大而且简单。

主要有一下两种形式:

<李>

(新型)表达式

<李>

新型(表达式)

C风格的转换格式很简单,但是有不少缺点:

1。转换太过随意,可以在任意类型之间转换。你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些。

2.摄氏度风格的转换没有统一的关键字和标示符。对于大型系统,做代码排查时容易遗漏和忽略。

<强> c++中的类型转换:

c++风格完美的解决了上面两个问题。1。对类型转换做了细分,提供了四种不同类型转换,以支持不同需求的转换;2。类型转换有了统一的标示符,利于代码排查和检视。下面分别来介绍这四种转换:static_cast, dynamic_cast, const_cast和reinterpreter_cast。

<李>

static_cast,命名上理解是静态类型转换。如int转换成char。

<李>

dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。

<李>

const_cast,字面上理解就是去const属性。

<李>

reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。

<强>一、static_cast转换

1。<>强基本用法:static_cast表达式

2。<强>使用场景:

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

上行转换(派生类——在基类)是安全的;

下行转换(基类,在派生类)由于没有动态类型检查,所以是不安全的。

b,用于基本数据类型之间的转换,如把int转换为char,这种带来安全性问题由程序员来保证

c,把空指针转换成目标类型的空指针

d,把任何类型的表达式转为无效类型

3。<强>使用特点

,主要执行非多态的转换操作,用于代替C中通常的转换操作

b,隐式转换都建议使用static_cast进行标明和替换

 int n=6;双d=static_cast (n);//基本类型转换int * pn=, n;双* d=static_cast<双*祝辞(和n)//无关类型指针转换,编译错误void * p=static_cast 

<强>二,dynamic_cast转换

1。<>强基本用法:dynamic_cast表达式

2。<强>使用场景:只有在派生类之间转换时才使用dynamic_cast, id类型必须是类指针,类引用或者void *。

3。<强>使用特点:

,基类必须要有虚函数,因为dynamic_cast是运行时类型检查,需要运行时类型信息,而这个信息是存储在类的虚函数表中,只有一个类定义了虚函数,才会有虚函数表(如果一个类没有虚函数,那么一般意义上,这个类的设计者也不想它成为一个基类)。

b,对于下行转换,dynamic_cast是安全的(当类型不一致时,转换过来的是空指针),而static_cast是不安全的(当类型不一致时,转换过来的是错误意义的指针,可能造成踩内存,非法访问等各种问题)

c, dynamic_cast还可以进行交叉转换

类BaseClass
  {公众:
  int m_iNum;
  虚拟空间foo(){},//基类必须有虚函数。保持多台特性才能使用dynamic_cast};类DerivedClass:公共BaseClass
  {公众:
  char * m_szName [100];
  空白栏(){};
  };
  
  BaseClass * pb=new DerivedClass ();
  DerivedClass * pd1=static_cast 

<强>三,const_cast转换

1。<>强基本用法:const_castexpression

2。<强>使用场景:

,常量指针转换为非常量指针,并且仍然指向原来的对象

c++中强制类型转换方法有哪些