C++显性契约与隐性规则:类型转换

C++显性契约与隐性规则:类型转换

文章目录

关于类型转换,通常是隐式转换或者强制转换,C++ 提供了一些能够显式表示转换的运算符,能够更好的规避一些风险和错误

1.传统的类型转换

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

voidTest(){int i =1;// 隐式类型转换double d = i;printf("%d, %.2f\n", i, d);int* p =&i;// 显示的强制类型转换int address =(int)p;printf("%x, %d\n", p, address);}

转换分为显式和隐式:

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

然而这两种转换的前提是逻辑相近:

  • 基本类型间的转换(如 intdouble
  • 继承层级中的转换(如子类→父类、父类→子类)
  • 用户定义的转换(如 operator T() 或带参数的构造函数)
string s; vector<int>=(vector<int>) s;

这种转换就会失败,因为逻辑不相近

对于强制转换还有一种特殊易错的场景

intmain(){constint n =10;int* p =(int*)&n;(*p)++; string s; vector<int>=(vector<int>) s; cout << n << endl; cout <<*p << endl;return0;}

无论是有点 C 语言基础的人,甚至是学完 C++ 的初学者,都很容易认为这里的输出结果是:n11*p11。但是结果并非所愿,输出结果:n10*p11

实际上这里涉及到存储规则的问题,因为 nconst 变量,那么会被识别为一个常变量,可能会是一个经常被使用的值,就把 n 存入寄存器,把频繁使用的变量的值暂存到寄存器中,这样在后续对该变量的读取操作中,就不需要每次都去内存中读取,直接从寄存器中获取即可,因为寄存器的读写速度比内存快很多

通常 cout 输出的值都是在内存里读取的,相比寄存器,内存读写速度较慢,但内存容量相对寄存器大很多,大多的代码都是存在这里的

因此这里输出的 n 是取自内存器,*p 取自内存

volatileconstint n =10;

volatile 关键字表示该变量的值可能会在程序未明确指定的情况下被改变,编译器不会对其进行优化,即不会被存入寄存器,这样取到的 n 就是内存中及时更新的值

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

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

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

2.C++强制类型转换

2.1 static_cast

intmain(){double d =12.34;int a =static_cast<int>(d); cout << a << endl;return0;}

static_cast 需要逻辑上的相近性

2.2 reinterpret_cast

intmain(){// 这里使用static_cast会报错,应该使用reinterpret_cast//int *p = static_cast<int*>(a);int* p =reinterpret_cast<int*>(a);return0;}

reinterpret_cast 几乎无类型限制,不要求类型相近,可强制转换任意指针或整数类型,但极其危险,可能导致:

  • 违反别名规则(如通过 char* 修改 int
  • 函数指针转换后调用,引发崩溃
  • 平台依赖(如不同架构的指针大小不同)

2.3 const_cast

voidTest(){volatileconstint a =2;int* p =const_cast<int*>(&a);*p =3; cout << a << endl;}

仅改变类型的 const / volatile 属性,这里用 reinterpret_cast 也不行的,因为 const 的转换是有风险的

2.4 dynamic_cast

classA{public:virtualvoidf(){}};classB:publicA{};voidfun(A* pa){// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回 B* pb1 =static_cast<B*>(pa); B* pb2 =dynamic_cast<B*>(pa); cout <<"pb1:"<< pb1 << endl; cout <<"pb2:"<< pb2 << endl;}intmain(){ A a; B b;fun(&a);fun(&b);return0;}

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

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

pa 是指向子类对象 B 的,转换可以成功,正常返回地址;pa 是指向父类对象 A 的,转换失败,返回空指针

🔥值得注意的是: 必须是继承关系中的类,基类必须包含虚函数

3.RTTI

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

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

  1. typeid 运算符
  2. dynamic_cast 运算符
  3. decltype

希望读者们多多三连支持

小编会继续更新

你们的鼓励就是我前进的动力!

请添加图片描述

Read more

tmux_for_windows windows上面安装 git bash 2026年 正是专门为了解决“SSH 掉线后还能继续原来的会话”这个问题而设计的工具

tmux_for_windows tmux是一个开源工具,用于在一个终端窗口中运行多个终端会话。本工具从msys2里提取,可以在Git for Windows的Git Bash (MingW64)下正常使用。 蘭雅sRGB 龙芯小本服务器 | https://262235.xyz ##tmux(以及 screen)正是专门为了解决“SSH 掉线后还能继续原来的会话”这个问题而设计的工具。 简单来说: 工具SSH 掉线后还能连上原来的会话吗?说明普通 bash / zsh不能会话结束,进程收到 SIGHUP 信号,通常被杀死tmux能会话独立于 SSH 连接存在,掉线后可以随时重新 attachscreen能和 tmux 功能几乎一样,但 tmux 现在更流行、功能更强zellij能更现代的替代品,但普及度不如 tmux tmux 的典型用法(SSH 掉线后重连)

By Ne0inhk
【Linux基础开发工具 (七)】Git 版本管理全流程与 GDB / CGDB 调试技巧

【Linux基础开发工具 (七)】Git 版本管理全流程与 GDB / CGDB 调试技巧

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 * 前情提示 * 1 Git的文件冲突:两人改同一个文件造成远程和本地仓库不同步 * 2 工作区 * 3 三板斧 * 4 调试的本质是什么 * 6 ~> Git版本控制器 * 前言(看过Git专栏的uu可以跳过这部分啦) * 6.1 入题:小故事 * 6.2 版本控制器 * 6.3 Git的历史发展 * 6.4 Git的安装 * 6.

By Ne0inhk
【STM32项目开源】基于STM32的智慧农业大棚系统

【STM32项目开源】基于STM32的智慧农业大棚系统

目录 一、设计背景和意义 1.1设计背景 1.2设计意义 二、实物效果展示 2.1实物图片 2.2实物演示视频 三、硬件功能简介 3.1项目功能详解 3.2元器件清单 四、主框图与软件流程图 五、硬件PCB展示 六、软件程序设计 七、项目资料包内容          资料获取:查看主页介绍“充哥单片机设计” 一、设计背景和意义 1.1设计背景         随着我国人口结构变化和农村劳动力持续减少,传统农业的粗放式管理模式已难以满足现代农业对“高产、高效、绿色、智能”的发展目标。国家在“十四五”规划和乡村振兴战略中,明确提出要加快智慧农业建设,推动信息技术、自动化设备与农业深度融合,实现农业生产从“经验型”向“

By Ne0inhk
23大开源AI智能体框架深度解析:从LangChain到AutoGPT,构建大模型应用全指南!

23大开源AI智能体框架深度解析:从LangChain到AutoGPT,构建大模型应用全指南!

随着人工智能技术的快速发展和广泛应用,智能体(AI Agent)技术已成为最具前景的研究方向之一。智能体通过将LLM与工具调用、记忆系统、推理规划等能力相结合,实现了从被动的问答系统向主动的任务执行系统的重要转变。 当前智能体框架的发展呈现出百花齐放的态势。从最早期的AutoGPT展示自主任务执行的可能性,到LangChain建立起完整的LLM应用开发生态,再到国内开源的Dify、Coze等,每个框架都在尝试解决智能体开发中的不同痛点。这些框架在架构设计、技术路线、应用场景等方面各具特色,形成了从学术研究到企业应用的完整生态链条。本文旨在对当前主流的开源智能体框架进行深度技术分析,为读者提供有价值的参考依据。 1.LangChain LangChain 由开发者 Harrison Chase 于 2022 年 10 月 发布,是最早专门为大语言模型构建应用开发框架的开源项目。目前由 LangChain 社区维护,核心代码托管在 GitHub,并衍生出 Python 与 JavaScript 两个主要分支。 LangChain 的初衷是让大语言模型具备调用外部知识和工具的能力。随

By Ne0inhk