首页后端开发ASP.NETC++中的四种强制类型转换

C++中的四种强制类型转换

时间2024-01-31 01:00:03发布访客分类ASP.NET浏览992
导读:收集整理的这篇文章主要介绍了C++中的四种强制类型转换_基本用法及使用场景,觉得挺不错的,现在分享给大家,也给大家做个参考。C中的类型转换: 事情要从头说起,这个头就是c语言.我们已经习惯了使用C-like类型转换,因为它强大而且简单.主...
收集整理的这篇文章主要介绍了C++中的四种强制类型转换_基本用法及使用场景,觉得挺不错的,现在分享给大家,也给大家做个参考。

C中的类型转换:

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

主要有一下两种形式:

  • (new-tyPE) exPression

  • new-type (exPRession)

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

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

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

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 expression

  2.使用场景

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

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

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

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

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

  d、把任何类型的表达式转为void类型

  3.使用特点

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

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

int n = 6;
    double d = static_castdouble>
    (n);
     // 基本类型转换int *pn = &
    n;
    double *d = static_castdouble *>
    (&
    n) //无关类型指针转换,编译错误void *p = static_castvoid *>
    (pn);
     //任意类型转换成void类型

二、dynamic_cast转换

  1.基本用法:dynamic_cast expression

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

  3.使用特点

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

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

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

class BaseClass {
    public:  int m_iNum;
  virtual void foo(){
}
    ;
//基类必须有虚函数。保持多台特性才能使用dynamic_cast}
    ;
class DerivedClass: public BaseClass {
    public:  char *m_szName[100];
  void bar(){
}
    ;
}
    ;
      BaseClass* pb = new DerivedClass();
    DerivedClass *pd1 = static_castDerivedClass *>
    (pb);
    //子类->
    父类,静态类型转换,正确但不推荐DerivedClass *pd2 = dynamic_castDerivedClass *>
    (pb);
    //子类->
    父类,动态类型转换,正确BaseClass* pb2 = new BaseClass();
    //父类->
    子类,静态类型转换,危险!访问子类m_szName成员越界DerivedClass *pd21 = static_castDerivedClass *>
    (pb2);
    //父类->
    子类,动态类型转换,安全的。结果是NULLDerivedClass *pd22 = dynamic_castDerivedClass *>
    (pb2);
    

三、const_cast转换

  1.基本用法:const_castexpression

  2.使用场景

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

  b、常量引用被转换为非常量引用,并且仍然指向原来的对象

  3.使用特点

  a、cosnt_cast是四种类型转换符中唯一可以对常量进行操作的转换符

  b、去除常量性是一个危险的动作,尽量避免使用。一个特定的场景是:类通过const提供重载时,一般都是非常量函数调用const_cast将参数转换为常量,然后调用常量函数,然后得到结果再调用const_cast 去除常量性。

struct SA {
      int i;
}
    ;
    const SA ra;
    //ra.i = 10;
     //直接修改const类型,编译错误SA &
    rb = const_castSA&
    >
    (ra);
    rb.i = 10;
    

四、reinterpret_cast转换

  1.基本用法:reinterpret_castexpression

  2.使用场景:不到万不得已,不用使用这个转换符,高危操作

  3.使用特点:  

  a、reinterpret_cast是从底层对数据进行重新解释,依赖具体的平台,可移植性差

  b、reinterpret_cast可以将整型转换为指针,也可以把指针转换为数组

  c、reinterpret_cast可以在指针和引用里进行肆无忌惮的转换

int DOSomething(){
    return 0;
}
    ;
    //FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 voidtypedef void(*FuncPtr)();
    //10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存//入funcPtrarray数组:FuncPtr funcPtrArray[10];
    funcPtrArray[0] = &
    doSomething;
    // 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArrayfuncPtrArray[0] = reinterpret_castFuncPtr>
    (&
    doSomething);
    //不同函数指针类型之间进行转换

总结:

去const属性用const_cast。

基本类型转换用static_cast。

多态类之间的类型转换用daynamic_cast。

不同类型的指针类型转换用reinterpreter_cast。

相关文章:

C++ 的强制类型转换

【c#教程】C# 类型转换

相关视频:

PHP数据类型转换之自动类型转换

以上就是C++中的四种强制类型转换_基本用法及使用场景的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: C语言不简单连程序员都这么说...下一篇:C++11新特性 - 多态和虚函数ov...猜你在找的ASP.NET相关文章 C# 一些面试试题的实例教程2022-05-16.NET 6开发TodoList应用之请求日志组件HttpLogging介绍2022-04-16.NET 6中间件Http Logging使用介绍2022-04-16gojs一些实用的高级用法2022-04-16.NET6开发TodoList应用之实现查询排序2022-04-16.NET6开发TodoList应用之实现数据塑形2022-04-16.NET微服务架构CI/CD自动打包镜像2022-04-16Asp.Net Core 使用Monaco Editor 实现代码编辑器功能2022-04-16.NET微服务架构CI/CD自动构建Jenkins+Gitee2022-04-16.Net Core微服务网关Ocelot集成Consul2022-04-16 其他相关热搜词更多phpjavapython

若转载请注明出处: C++中的四种强制类型转换
本文地址: https://pptw.com/jishu/593272.html
C++---浅拷贝、深拷贝、写时拷贝讲解(附代码) 聊聊nodejs中的get/post请求和中间件

游客 回复需填写必要信息