深入浅出C++——C++的类型转换

这篇具有很好参考价值的文章主要介绍了深入浅出C++——C++的类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


C语言中的类型转换

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

C语言中总共有两种形式的类型转换:

  • 隐式类型转换:编译器在编译阶段自动进行转换,不能转就编译失败。
  • 显式类型转换:需要用户自己处理。
void Test ()
{
    int i = 1;
    double d = i; // 隐式类型转换(意义相近的类型)
    
    int* p = &i;
    int address = (int) p;// 显示的强制类型转换(意义不相近的类型,但是值转换后有意义)
}

C语言中的类型转换缺陷:

  1. 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。
  2. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失。
  3. 显式类型转换将所有情况混合在一起,代码不够清晰。

C++强制类型转换

为了弥补C语言类型转换的缺陷,C++提出了自己的类型转化风格,并且C++中还可以使用C语言的转化风格。

static_cast

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

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

reinterpret_cast

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

int main()
{
  double d = 12.34;
  int a = static_cast<int>(d); //12

  int* p = reinterpret_cast<int*>(a); 
  cout << p << endl;			//000000000000000C
  return 0;
}

const_cast

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

int main()
{
	volatile const int a = 2;
	int* p = const_cast<int*>(&a);
	*p = 3;              //修改
	cout << a << endl;   //3
	return 0;
}

编译器以为a不会改,把a放到了寄存器中,打印的时候去寄存器中拿,加volatile可以去掉编译器的优化,拿到内存中正确的值。


dynamic_cast

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

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

  • 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

  • dynamic_cast只能用于父类含有虚函数的类

  • dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr。

  • dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理, 即会作出一定的判断。文章来源地址https://www.toymoban.com/news/detail-464664.html

    //A*类型指针有可能指向父类,也有可能指向子类
    void fun(A* pa)
    {
    	//如果pa指向子类,那么可以转换,表达式返回正确的地址
    	//如果pa指向父类,那么不可以转换,表达式返回0
    	// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr
    	
    	B* pb = dynamic_cast<B*>(pa); //父类转换为子类安全
    	//B* pb = (B*)pa;			  //父类转换为子类不安全
    	if (pb)
    	{
    		cout << "转换成功" << endl;
    		///
    	}
    	else
    	{
    		cout << "转换失败" << endl;
    	}	
    }
    
    int main()
    {
    	A a;
    	B b;
    	fun(&a);
    	fun(&b);
    	return 0;
    }
    

到了这里,关于深入浅出C++——C++的类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深入浅出C#】章节 5: 高级面向对象编程:泛型编程和集合类型

    高级面向对象编程是在基础面向对象编程的基础上进一步深入和拓展的一种编程范式。它强调封装、继承和多态的概念,并引入了泛型编程和集合类型等高级特性。高级面向对象编程提供了更灵活、可扩展和可复用的代码结构,能够帮助开发者构建更复杂、更高效的应用程序

    2024年02月16日
    浏览(34)
  • 深入浅出循环语句—【C语言】

      分支语句博客: http://t.csdn.cn/U2kZF 目录 ​编辑 前言:我们先来了解一下break 、continue在循环中的作用 1. while循环  while循环中的break  while循环中的continue  2. for循环 for循环省略出错举例:  for循环中的break  for循环中的continue 3. do   while循环 利用do while循环打印1~10   d

    2024年02月04日
    浏览(30)
  • 深入浅出C语言—【函数】上

       目录 1.函数的概念 2.C语言函数的分类 2.1 库函数 2.1.1 strcpy库函数举例学习方式 2.1.2 库函数扩展知识 2.2 自定义函数 2.2.1求两个整数中的较大值 3. 函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4. 函数的调用 4.1 传值调用 4.2 传址调用 老铁们,网址自取,记得一键

    2024年02月07日
    浏览(23)
  • 深入浅出分支语句—【C语言】

    目录 前言:为什么要学习分支和循环语句呢? 1. 语句的分类 2. 分支语句(选择语句) 2.1 if-else语句 注意点:if-else语句后面不加{},默认只能跟一条语句 2.2  switch语句  注意点: 因为C语言是一门结构化的程序设计语言,具有三种结构:顺序结构、选择结构、循环结构,这三

    2024年02月02日
    浏览(49)
  • 深入浅出C语言—【函数】下

    函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。 注意: 函数可以嵌套调用,但是不能嵌套定义。 把一个函数的返回值作为另外一个函数的参数。 上面的strlen函数是求数组长度的库函数, 特别注意的是,当数组为字符数组时,数组的末尾会自动放一个

    2024年02月17日
    浏览(54)
  • 【C++深入浅出】类和对象下篇

            老样子,先来回顾一下上期的内容:上期我们着重学了C++类中的六大 默认成员函数 ,并自己动手实现了一个 日期类 ,相信各位对C++中的类已经有了一定程度的了解。本期就是类和对象的最后一篇啦,终于要结束咯,吧唧吧唧         话不多说,开吃咯!!! 2.1

    2024年02月08日
    浏览(34)
  • 【C++深入浅出】初识C++中篇(引用、内联函数)

      目录 一. 前言 二. 引用 2.1 引用的概念 2.2 引用的使用 2.3 引用的特性 2.4 常引用 2.5 引用的使用场景 2.6 传值、传引用效率比较 2.7 引用和指针的区别  三. 内联函数 3.1 内联函数的概念 3.2 内联函数的特性          上期说道,C++是在C的基础之上,容纳进去了 面向对象编程

    2024年02月12日
    浏览(26)
  • 深入浅出:大语言模型的视觉解析

    一系列工具与文章的汇编,直观易懂地解读复杂的 AI 概念 图片由作者利用 unDraw.co 的免费插图制作 在当今世界,大语言模型(LLM)成为了热门话题。几乎每天都有新的语言模型问世,让人们在 AI 领域怀有一种“不容错过”的紧迫感。尽管如此,许多人仍对大语言模型的基础

    2024年01月19日
    浏览(28)
  • 【C++深入浅出】日期类的实现

    目录 一. 前言  二. 日期类的框架 三. 日期类的实现 3.1 构造函数 3.2 析构函数 3.3 赋值运算符重载 3.4 关系运算符重载 3.5 日期 +/- 天数 3.6 自增与自减运算符重载 3.7 日期 - 日期 四. 完整代码          通过前面两期类和对象的学习,我们已经对C++的类有了一定的了解。本期我

    2024年02月07日
    浏览(31)
  • 【C++】模板初阶 【 深入浅出理解 模板 】

    如何实现一个通用的交换函数呢? 使用函数重载虽然可以实现 ,但是有一下几个不好的地方: 重载的函数 仅仅是类型不同 ,代码复用率比较低, 只要有新类型出现时,就需要用户自己增加对应的函数 代码的可维护性比较低,一个出错可能所有的重载均出错 那能否 告诉编

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包