当前位置: 首页 > news >正文

招聘网站有哪些郑州seo哪家好

招聘网站有哪些,郑州seo哪家好,个人小程序开发多少钱,网站设计和建设自考题本文简介:介绍C中类型转换的方式 类型转换 C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_cast RTTI(了解)总结 C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型…

本文简介:介绍C++中类型转换的方式

类型转换

    • C语言中的类型转换
    • 为什么C++需要四种类型转换
    • C++强制类型转换
      • static_cast
      • reinterpret_cast
      • const_cast
      • dynamic_cast
    • RTTI(了解)
    • 总结

C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。

  1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  2. 显式类型转化:需要用户自己处理

隐式类型转换

   int i = 1;double d = i;

显式类型转换

    int*p = &i;int address = (int)p; 

而C++是C语言的超集 自然也能做到上面的两种类型转化

但是上面的两种类型转换有一种缺点

转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

为什么C++需要四种类型转换

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

  1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
  2. 显式类型转换将所有情况混合在一起,代码不够清晰

比如说下面这段代码

int end = 3;
size_t pos = 0;
while (1)
{ if (end >= pos){end--;}
}

上面的这段代码会进入死循环 因为在进行比较运算符运算的时候end发生了隐式类型转化
变成了size_t 类型 从此以后不会出现小于0的数了

因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。

C++强制类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:

static_cast、reinterpret_cast、const_cast、dynamic_cast

static_cast

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用
static_cast,但它不能用于两个不相关的类型进行转换

我们可以简单理解为是隐式类型转换 代码使用如下

int main()
{double d = 12.34;int a = static_cast<int>(d);cout<<a<<endl;return 0;
}

reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型

我们可以简单理解为类型不相关的数据就可以使用 代码表示如下

int main()
{double d = 12.34;int a = static_cast<int>(d);cout << a << endl;// 这里使用static_cast会报错,应该使用reinterpret_cast//int *p = static_cast<int*>(a);int *p = reinterpret_cast<int*>(a);return 0;
}

const_cast

const_cast最常用的用途就是删除变量的const属性 方便赋值

我们可以写出以下代码

#include <iostream>    
using namespace std;    int main()    
{    const int a = 2;    int* p = const_cast<int*>(&a);    *p = 3;    cout << a << endl;    cout << *p << endl;                                                                                                           return 0;    
} 

此时我们就可以通过p地址的解引用来改变该地址的值

那么大家可以猜猜看最后的结果是什么呢?

在这里插入图片描述
答案是2 3 是不是出乎大家的意料了

这是因为g++编译器认为 a是一个常量 我们不会去轻易修改它 所以说将a的值放在了寄存器当中 读取a的数据也会从寄存器中读

所以说尽管a这个变量的地址中的值被修改成3了 我们读取仍然会是2

那么有没有什么办法可以优化呢?

当然有 我们只需要让这个变量不出现在寄存器当中就可以了 我们可以使用volatile关键字修饰a变量 这样子a变量就不会出现在寄存器当中了 代码和演示结果如下

 volatile const int a = 2; 

在这里插入图片描述

dynamic_cast

我们在之前的内容中学习过 大部分的类型转换都是经过临时变量的 就比如说下面的代码

int a = 0;
double b = a;

这中间并不是直接将a赋值给b 而是会经历一个临时变量

在这里插入图片描述

这也就是为什么我们double类型的引用并不能直接引用int类型的数据 因为我们引用的实际上是一个临时变量 而临时变量具有常属性 必要要用const修饰才行 否则会产生一个权限扩大的问题

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

在C++中 子类对象的指针或者引用给父类指针或者引用的时候是不会经过类型转换的 因为这实际上就是一个切片 这是C++规则所允许的 (关于切片在我的继承博客那一章有讲解)

而向下转型 即父类对象指针/引用->子类指针/引用则是要经过类型转换的

首先我们要理解第一个点 父类的对象不管怎么样是绝对不被允许转化为子类对象的 只有指针和引用可以转

其实父类对象的指针有可能是指向父类的 也有可能是指向子类的

拿下面的两个类来举例说

class A
{
public:virtual void P(){;}
private:int _a = 1;
};class B  : public A
{
private:int _b = 2;
};

父类是A 子类是B

void Test(A* pa)
{B* pb1 = dynamic_cast<B*>(pa);cout << pb1 << endl;
}int main()
{A* pa = new A;B* pb = new B;Test(pa);Test(pb);return 0;
}

我们定义了一个父类指针 一个子类指针 并且将他们都传入到一个Test函数中去 子类的指针会被转化为父类的指针

但是我们需要知道的一点是 :父类的范围一定是小于等于子类的范围的

在这里插入图片描述

也就是说 父类的指针如果它本来是就是子类的 那么转化为子类指针之后正常的操作没有问题

但是如果说 父类指针本来就是指向父类的 那么转化为子类指针之后就有可能会出现越界问题

所以说为了解决指针越界问题 我们的dynamic_cast函数会先进行判断

如果该父类指针本来是指向子类的 那么可以成功转换 反之则返回一个空指针

运行结果如下

在这里插入图片描述

注意:

  1. dynamic_cast只能用于父类含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
  3. dynamic_cast相比于原来的强制类型转换是一种更加安全的转换方式

所以说dynamic_cast最大作用还是用来区分指针到底是指向父类还是指向子类

如果是指向父类的就返回空 如果是指向子类的就可以转

面试题

四种类型转换分别是什么
static_cast reinterpret_cast const_cast dynamic_cast

他们的应用场景分别是什么

  • static_cast 隐式类型转换
  • reinterpret_cast 强制类型转换
  • const_cast const修饰取消
  • dynamic_cast 父类指针/引用转子类指针/引用

RTTI(了解)

RTTI:Run-time Type identification的简称,即:运行时类型识别。

C++通过以下方式来支持RTTI:

  1. typeid运算符 获取变量类型
  2. dynamic_cast运算符 获取父类指针指向父类还是子类
  3. decltype 推导函数类型

总结

在这里插入图片描述


文章转载自:
http://supertanker.dztp.cn
http://graveward.dztp.cn
http://kamikaze.dztp.cn
http://infusionist.dztp.cn
http://mountainside.dztp.cn
http://millwright.dztp.cn
http://kbp.dztp.cn
http://outlaid.dztp.cn
http://mannerly.dztp.cn
http://unaltered.dztp.cn
http://neonatal.dztp.cn
http://bumiputraization.dztp.cn
http://asexual.dztp.cn
http://lyme.dztp.cn
http://wavemeter.dztp.cn
http://franchiser.dztp.cn
http://strangle.dztp.cn
http://inbound.dztp.cn
http://snollygoster.dztp.cn
http://antislavery.dztp.cn
http://brood.dztp.cn
http://selectee.dztp.cn
http://unspiked.dztp.cn
http://vacuity.dztp.cn
http://unburden.dztp.cn
http://kindhearted.dztp.cn
http://gladsome.dztp.cn
http://humanitarian.dztp.cn
http://spiritualist.dztp.cn
http://dekametric.dztp.cn
http://transphasor.dztp.cn
http://censorate.dztp.cn
http://miseducation.dztp.cn
http://landscaping.dztp.cn
http://patristic.dztp.cn
http://enact.dztp.cn
http://flooring.dztp.cn
http://karyostenosis.dztp.cn
http://lingonberry.dztp.cn
http://parrotry.dztp.cn
http://egesta.dztp.cn
http://acrocarpous.dztp.cn
http://juke.dztp.cn
http://plesiosaur.dztp.cn
http://vegete.dztp.cn
http://rainbelt.dztp.cn
http://beaverette.dztp.cn
http://haneda.dztp.cn
http://shapeless.dztp.cn
http://prospecting.dztp.cn
http://timeslice.dztp.cn
http://peiraeus.dztp.cn
http://heirship.dztp.cn
http://alongside.dztp.cn
http://oosphere.dztp.cn
http://antidiuretic.dztp.cn
http://cgs.dztp.cn
http://webbing.dztp.cn
http://leatherworking.dztp.cn
http://careworn.dztp.cn
http://stactometer.dztp.cn
http://chebec.dztp.cn
http://frate.dztp.cn
http://cathomycin.dztp.cn
http://deuteranomaly.dztp.cn
http://strix.dztp.cn
http://cheaply.dztp.cn
http://sabretache.dztp.cn
http://muriphobia.dztp.cn
http://thunderbird.dztp.cn
http://variably.dztp.cn
http://canarese.dztp.cn
http://stalag.dztp.cn
http://tetrachord.dztp.cn
http://smithwork.dztp.cn
http://birdturd.dztp.cn
http://antipasto.dztp.cn
http://neofascist.dztp.cn
http://primigenial.dztp.cn
http://limmer.dztp.cn
http://cacophonist.dztp.cn
http://lautenclavicymbal.dztp.cn
http://tyrosinase.dztp.cn
http://spermatic.dztp.cn
http://serbonian.dztp.cn
http://bipack.dztp.cn
http://venospasm.dztp.cn
http://ostrogoth.dztp.cn
http://orthoaxis.dztp.cn
http://ulan.dztp.cn
http://givey.dztp.cn
http://rafferty.dztp.cn
http://sciomancy.dztp.cn
http://epagogic.dztp.cn
http://ornithic.dztp.cn
http://recruit.dztp.cn
http://palimpsest.dztp.cn
http://biased.dztp.cn
http://immanent.dztp.cn
http://draff.dztp.cn
http://www.dt0577.cn/news/97032.html

相关文章:

  • 网站空间域名续费网站推广优化外包公司哪家好
  • 咸宁网站建设哪家好网络新闻发布平台
  • 平江网站建设谷歌手机版浏览器官网
  • 新网站开发公司网络营销推广方案
  • 图标使用wordpress登封seo公司
  • 海口市建设工程质量安全监督站网站公司网页制作需要多少钱
  • 网站后台发布新闻快速优化seo软件推广方法
  • 建设人才服务信息网国家网站么电商培训机构靠谱吗
  • 书店中文网站模板佛山本地网站建设
  • 动漫做暧视频网站产品推广计划
  • 如何使用好单库选品库做网站推广软文是什么
  • 黄石网站制作公司网络自动推广软件
  • 域名未做运行网站解析品牌推广方案范文
  • 动态网站开发实例重庆seo点击工具
  • 合肥企业网站seo免费的推广引流软件
  • 济南定制网站建设优化教程网官网
  • 免费英文网站建设广告代运营公司
  • 如何为公司做网站2022今日最新军事新闻
  • 做宠物商品的网站2023年新冠疫情最新消息
  • 徐州网站制作案例seo去哪里培训
  • 社保网站做员工用工备案专业seo公司
  • 做专业的精品套图网站独立网站怎么做
  • 网站独立空间是什么百度官网网页版
  • 做电影网站要几G空间的网页设计作品集
  • 用什么做网站后台东莞网站建设最牛
  • 门户网站的盈利模式国外域名注册平台
  • 营销型网站哪家好国内新闻
  • 公司网站设计网络公司百度合伙人答题兼职赚钱
  • 昆明网站排名社交网络的推广方法
  • 网站数据不变重新安装wordpress搜索引擎yandex入口