C++中的算术转换、其他隐式类型转换和显示转换详解

news2025/4/22 7:01:47

C++中的类型转换(Type Conversion)是指将一个数据类型的值转换为另一个数据类型的过程,主要包括:


一、算术类型转换(Arithmetic Conversions)

算术类型转换通常发生在算术运算或比较中,称为**“标准转换”(standard conversion),遵循一定的提升规则(promotion rules)**。

转换规则(简化版):

  1. boolint
  2. 整型提升:charshortint
  3. 两个操作数不同类型时:
    • 若一个为浮点型,另一个为整型 → 整型转换为浮点型
    • 若一个为double,另一个为floatfloat 转为 double
    • 若一个为unsigned且它的值不能用int表示 → int转为unsigned
    • 否则,unsigned提升优先级高于signed

示例:

#include <iostream>
int main() {
    char c = 100;
    int i = 200;
    float f = 1.5f;
    double d = 3.14;

    auto result1 = c + i;   // char → int,结果是 int
    auto result2 = i + f;   // int → float,结果是 float
    auto result3 = f + d;   // float → double,结果是 double

    std::cout << "result1: " << result1 << "\n"; // 300
    std::cout << "result2: " << result2 << "\n"; // 201.5
    std::cout << "result3: " << result3 << "\n"; // 4.64
}

二、其他隐式类型转换(Implicit Conversion)

这是 编译器自动完成 的转换,也叫类型提升(promotion)或类型协同(coercion)

常见的隐式转换:

类型转换方向示例
数值型更大/更精度的数值intdouble
指针类型派生类 → 基类Derived*Base*
空指针nullptr → 任何指针类型nullptr → int*
数组/函数 → 指针int arr[]int*

示例:

void printDouble(double d) {
    std::cout << "Double: " << d << "\n";
}

class Base {};
class Derived : public Base {};

int main() {
    int i = 42;
    printDouble(i); // int → double(隐式)

    Derived d;
    Base* bptr = &d; // Derived* → Base*(隐式)
}

三、显示类型转换(Explicit Conversion / Cast)

你可以显式地指示编译器进行类型转换,有四种标准C++风格的转换方式(推荐),以及一个C风格的转换(不推荐)。

四种C++显式转换:

  1. static_cast<T>(expr)
    ➤ 用于基本类型之间转换指针/引用向上转换等安全转换。

  2. dynamic_cast<T>(expr)
    ➤ 用于带有虚函数的多态类之间的安全运行时类型检查和向下转换

  3. const_cast<T>(expr)
    添加或去除const、volatile限定符,常用于函数参数处理。

  4. reinterpret_cast<T>(expr)
    不安全但允许的位级别转换,如指针与整数之间转换。

  5. (T)expr —— C风格强制转换
    ➤ 组合了上述所有功能,不安全不透明,不推荐使用


示例:

#include <iostream>
class Base { public: virtual ~Base() {} };
class Derived : public Base { public: void say() { std::cout << "Derived\n"; } };

int main() {
    int i = 100;
    double d = static_cast<double>(i);  // int → double

    Base* b = new Derived();
    Derived* dptr = dynamic_cast<Derived*>(b);  // 安全向下转型
    if (dptr) dptr->say();

    const int ci = 42;
    int* p = const_cast<int*>(&ci);  // 去除 const 限定

    void* vptr = reinterpret_cast<void*>(p); // int* → void*
    int* iptr = reinterpret_cast<int*>(vptr); // void* → int*

    delete b;
}

四、总结对比表:

转换类型触发方式安全性用途/说明
算术转换自动安全数值运算中的标准提升
隐式转换自动通常安全函数调用/指针/基本类型提升
static_cast显式安全编译期可检查的转换,如 int→float,向上转型
dynamic_cast显式安全多态类型的运行时向下转型
const_cast显式有风险去除 const/volatile
reinterpret_cast显式不安全位级别转换,极端情况用
C风格强制转换显式不推荐混合多个C++转换,缺乏类型安全

五、综合例子

下面是一个C++ 示例工程,通过一个模拟图形系统的类结构,演示了**各种类型转换(隐式、算术、显示转换)**的组合使用。代码里有注释,方便理解每一种转换在什么时候触发、为什么安全或者不安全。

定义 shape.h图形类头文件内容如下:

#pragma once
#include <iostream>
#include <string>

class Shape {
public:
    virtual ~Shape() {}
    virtual void draw() const;
};

class Circle : public Shape {
public:
    Circle(double r);
    void draw() const override;
    double getRadius() const;
private:
    double radius;
};

class Rectangle : public Shape {
public:
    Rectangle(int w, int h);
    void draw() const override;
    int area() const;
private:
    int width, height;
};

// 模拟图形渲染系统的底层资源对象
struct RenderHandle {
    void* data;
};

RenderHandle createHandle(int id);

shape.cpp 图形类实现如下:

#include "shape.h"

void Shape::draw() const {
    std::cout << "Drawing Shape\n";
}

Circle::Circle(double r) : radius(r) {}
void Circle::draw() const {
    std::cout << "Drawing Circle with radius: " << radius << "\n";
}
double Circle::getRadius() const {
    return radius;
}

Rectangle::Rectangle(int w, int h) : width(w), height(h) {}
void Rectangle::draw() const {
    std::cout << "Drawing Rectangle of area: " << area() << "\n";
}
int Rectangle::area() const {
    return width * height;
}

RenderHandle createHandle(int id) {
    RenderHandle h;
    h.data = reinterpret_cast<void*>(id);  // 显式 reinterpret_cast
    return h;
}

main.cpp 主函数演示各种类型转换示例内容如下:

#include "shape.h"
#include <typeinfo>

void printDouble(double d) {
    std::cout << "Double value: " << d << "\n";
}

int main() {
    // 算术类型转换(int → double)
    int i = 42;
    double d = i; // 隐式转换
    printDouble(d); // 参数是 double

    float f = static_cast<float>(i); // 显式 static_cast
    std::cout << "Float from int: " << f << "\n";

    // 基类 → 派生类的动态转换(dynamic_cast)
    Shape* s = new Circle(3.5);
    s->draw();

    if (Circle* c = dynamic_cast<Circle*>(s)) {
        std::cout << "Radius from casted circle: " << c->getRadius() << "\n";
    }

    // const_cast 演示
    const int ci = 100;
    int* modifiable = const_cast<int*>(&ci);
    *modifiable = 999; // 未定义行为,仅演示用
    std::cout << "Modified const int (unsafe!): " << *modifiable << "\n";

    // reinterpret_cast 演示
    int resourceID = 1234;
    RenderHandle h = createHandle(resourceID);
    int recoveredID = reinterpret_cast<int>(h.data);
    std::cout << "Recovered ID from RenderHandle: " << recoveredID << "\n";

    // 隐式派生 → 基类(安全)
    Rectangle rect(10, 20);
    Shape* s2 = &rect;
    s2->draw();  // 虚函数,多态行为

    delete s;
    return 0;
}

示例的演示内容如下:

场景类型转换涉及关键字/方式
int → double算术隐式转换自动
float ← int算术显式转换static_cast
Base* ← Derived*隐式向上转换自动
Derived* ← Base*安全运行时转换dynamic_cast
const int* ← int*添加/去除 constconst_cast
void* ←→ int指针/整数转换reinterpret_cast
Shape 多态行为虚函数机制隐式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GAIA-2:用于自动驾驶的可控多视图生成世界模型

25年3月来自英国创业公司 Wayze 的论文“GAIA-2: A Controllable Multi-View Generative World Model for Autonomous Driving”。&#xff08;注&#xff1a;23年9月其发布GAIA-1&#xff09; 生成模型为模拟复杂环境提供一种可扩展且灵活的范例&#xff0c;但目前的方法不足…

浅谈AI致幻

文章目录 当前形势下存在的AI幻觉&#xff08;AI致幻&#xff09;什么是AI幻觉AI幻觉的类型为什么AI会产生幻觉AI幻觉的危害与影响当前应对AI幻觉的技术与方法行业与学术界的最新进展未来挑战与展望结论 当前形势下存在的AI幻觉&#xff08;AI致幻&#xff09; 什么是AI幻觉 …

车载软件架构 --- 二级boot设计说明需求规范

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

Java高效合并Excel报表实战:GcExcel让数据处理更简单

前言&#xff1a;为什么需要自动化合并Excel&#xff1f; 在日常办公场景中&#xff0c;Excel报表合并是数据分析的基础操作。根据2023年企业办公效率报告显示&#xff1a; 财务人员平均每周花费6.2小时在Excel合并操作上人工合并的错误率高达15%90%的中大型企业已采用自动化…

第十四届蓝桥杯 2023 C/C++组 平方差

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 第一种思路&#xff1a; 第二种思路&#xff1a; 坑点&#xff1a; 代码&#xff1a; 数学找规律 O(n) 50分代码详解&#xff1a; O(1)满分代码详解&#x…

I/O复用函数的使用——select

I/O复用函数的使用——select 目录 一、概念 二、select接口 2.1 基础概念 2.2 使用 select 函数的标准输入读取代码 2.3 基于 select 模型的多客户端 TCP 服务器实现 一、概念 i/o复用使得程序能同时监听多个文件描述符&#xff0c;可以提高程序性能。 之前为了让服务器能…

图像预处理-图像轮廓特征查找

其实就是外接轮廓&#xff0c;有了轮廓点就可以找到最上、最下、最左、最右的四个坐标&#xff08;因为有xmin,xmax,ymin,ymax&#xff09;。就可以绘制出矩形。 一.外接矩形 cv.boundingRect(轮廓点) - 返回x,y,w,h&#xff0c;传入一个轮廓的轮廓点&#xff0c;若有多个轮廓需…

全同态加密医疗数据分析集python实现

目录 摘要一、前言二、全同态加密与医疗数据分析概述2.1 全同态加密(FHE)简介2.2 医疗数据分析需求三、数据生成与预处理四、系统架构与流程4.1 系统架构图五、核心数学公式六、异步任务调度与(可选)GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望…

list的学习

list的介绍 list文档的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一…

HarmonyOS:Navigation实现导航之页面设置和路由操作

导读 设置标题栏模式设置菜单栏设置工具栏路由操作页面跳转页面返回页面替换页面删除移动页面参数获取路由拦截 子页面页面显示类型页面生命周期页面监听和查询 页面转场关闭转场自定义转场共享元素转场 跨包动态路由系统路由表自定义路由表 示例代码 Navigation组件适用于模块…

管道位移自动化监测方案

一、背景 管道系统在区域性地质沉降作用下易形成非均匀应力场集中现象&#xff0c;诱发管体屈曲变形及环焊缝界面剥离等连续损伤累积效应&#xff0c;进而导致管道力学性能退化与临界承载能力衰减。传统人工巡检受限于空间覆盖度不足及数据采集周期长&#xff08;≥72h&#xf…

【学习笔记】机器学习(Machine Learning) | 第五周| 分类与逻辑回归

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 一、逻辑回归的基本原理分类判断条件模型输出的解释Sigmoid 函数与 Logistic 函数逻辑…

Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例

Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例 内容概要 第8章深入探讨了计算机视觉中的深度学习&#xff0c;特别是卷积神经网络&#xff08;convnets&#xff09;的应用。本章详细介绍了卷积层和池化层的工作原理、数据增强技术、预训练模型的特征…

[免费]SpringBoot+Vue博物馆(预约)管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue博物馆(预约)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue博物馆(预约)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着计算机科学技术的日渐成熟&#xff…

【python】pyCharm常用快捷键使用-(2)

pyCharm常用快捷键使用 快速导入任意类 【CTRLALTSPACE】代码补全【CTRLSHIFTENTER】代码快速修正【ALTENTER】代码调试快捷键

机器视觉lcd屏增光片贴合应用

在现代显示制造领域&#xff0c;LCD屏增光片贴合工艺堪称显示效果的"画龙点睛"之笔。作为提升屏幕亮度、均匀度和色彩表现的关键光学组件&#xff0c;增光片的贴合精度直接影响着终端用户的视觉体验。传统人工贴合方式难以满足当前超窄边框、高分辨率显示屏的严苛要求…

VScode-py环境

settings.json {"git.ignoreLimitWarning": true,"code-runner.runInTerminal": true,"code-runner.executorMap": {"python": "python3"} } 第二句话保证在终端里面进行IO 第三句话保证python3的用户不会执行python关键…

用键盘实现控制小球上下移动——java的事件控制

本文分享Java的一个有趣小项目&#xff0c;实现用键盘控制小球的移动 涉及java知识点&#xff1a;Swing GUI框架&#xff0c;绘图机制&#xff0c;事件处理&#xff0c;焦点控制 1.编写窗口和面板 (1.)定义面板类 Panel 继承自Java 自带类JPanel (2.)定义窗口类 window 继承…

《马尼拉》桌游期望计算器

《马尼拉》桌游期望计算器&#xff1a;做出最明智的决策 注&#xff1a;本项目仍在开发验证中&#xff0c;计算结果可能不够准确&#xff0c;欢迎游戏爱好者提供协助&#xff01; 在线使用 | GitHub 项目简介 马尼拉期望计算器是一个基于 Vue 3 Vite 开发的网页应用&#xff…

动态LOD策略细节层级控制:根据视角距离动态简化远距量子态渲染

动态LOD策略在量子计算可视化中的优化实现 1. 细节层级控制:动态简化远距量子态渲染 在量子计算的可视化中,量子态通常表现为高维数据(如布洛赫球面或多量子比特纠缠态)。动态LOD(Level of Detail)策略通过以下方式优化渲染性能: 距离驱动的几何简化: 远距离渲染:当…