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

遵化建设局网站近期新闻热点大事件

遵化建设局网站,近期新闻热点大事件,可以看qq空间的网站,国内永久免费crm系统网站推荐C中的类型转换(Type Conversion)是指将一个数据类型的值转换为另一个数据类型的过程,主要包括: 一、算术类型转换(Arithmetic Conversions) 算术类型转换通常发生在算术运算或比较中,称为**“标…

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,结果是 intauto result2 = i + f;   // int → float,结果是 floatauto result3 = f + d;   // float → double,结果是 doublestd::cout << "result1: " << result1 << "\n"; // 300std::cout << "result2: " << result2 << "\n"; // 201.5std::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 → doubleBase* 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_castreturn 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); // 参数是 doublefloat f = static_cast<float>(i); // 显式 static_caststd::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.dtcms.com/a/586205.html

相关文章:

  • 教育类集群网站建设python做网站优势
  • 未成年人思想道德建设网站招标网上的项目好中标吗
  • 【C++】封装哈希桶实现unordered_map和unordered_set
  • 多语言网站建设应注意哪些事项做沙盘实训在哪个网站做
  • 沈阳专业制作网站东莞家具网站建设
  • 制造业营销外贸网站建设手机网站建设 技术规范
  • C# var 关键字详解:从入门到精通
  • 使用 SQLAlchemy 连接数据库:从基础到最佳实践
  • 如何使用Profiler进行内存分析?
  • 12306网站开发携程网站建设计划管理与进度控制
  • 淮南电商网站建设价格新校区建设网站管理规定
  • 进入新岗位的第一课——潜龙勿用
  • DeepSeek辅助编写转换DuckDB explain_analyze_json 格式执行计划到postgresql_plan 的程序
  • 旅游网站网页设计图片网络营销和网络销售的区别
  • STM32H743-ARM例程41-FMC_INDEP
  • 网站怎么申请百度小程序室内设计师网上培训班
  • 【Java 并发编程】线程创建 6 种方式:Thread/Runnable/Callable 核心类解析+线程池使用说明
  • 第四课:时序逻辑进阶 - 有限状态机(FSM)设计
  • Unicode全字符集加解密工具 - 强大的编码转换GUI应用
  • 网站管理和维护设计师学编程能自己做网站吗
  • PyInstaller 工具使用文档及打包教程
  • 怎么建商业网站外国广告公司网站
  • USB Gadget 技术
  • 常州小型网站建设北京电商网站开发公司哪家好
  • 1108秋招随记
  • 做自己视频教程的网站wordpress去除谷歌
  • 咋把网站制作成软件建设网站需要注意什么手续
  • 线程4.2
  • SOAR:利用状态空间模型和可编程梯度进行航空影像中小目标物体检测的进展
  • 开一个网站需要多少钱网站开发工作量评估