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

类型转换

1-类型转换定义

类型转换(Type Conversion)是将一种数据类型转换为另一种数据类型的过程。在C和C++中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,总共有两种形式的类型转换:隐式类型 转换和显式类型转换。

2 -类型转换方式

2.1.隐式类型转换

隐式类型转换是由编译器自动执行的类型转换,通常发生在不同数据类型之间进行运算或赋值时。隐式转换主要分为以下几种情况:

 --标准转换

标准转换包括以下几种常见的类型转换:

算术转换:例如,将 int 转换为 float,或 char 转换为 int

代码:

int a = 5;
double b = a; // int 转换为 double
指针转换:例如,将派生类指针转换为基类指针(向上转换),或 void* 转换为其他类型的指针。 
class Base {};
class Derived : public Base {};

Derived d;
Base* b = &d; // Derived* 转换为 Base*
布尔转换:任何算术类型或指针类型都可以隐式转换为 bool。 
int a = 5;
if (a) { // int 转换为 bool
    return true;
}

 --用户定义的转换

用户可以通过定义转换构造函数或转换运算符来实现自定义类型之间的隐式转换。

//转换构造函数
class MyClass {
public:
    MyClass(int x) { // 转换构造函数
        // ...
    }
};

MyClass obj = 10; // int 转换为 MyClass
//转换运算符
class MyClass {
public:
    operator int() const { // 转换运算符
        return 42;
    }
};

MyClass obj;
int a = obj; // MyClass 转换为 int

2.2 显式类型转换  

 c中的强制类型转换

使用 (类型) 的语法进行类型转换。这种方式在C++中能用,但不够安全,容易出错。

double a = 3.14;
int b = (int)a; // C的强制转换

 3. C++强制类型转换

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

a. static_cast

static_cast 用于在相关类型之间进行转换,如基本数据类型之间的转换、指针的上行转换(派生类指针转换为基类指针)等。它在编译时进行类型检查,较为安全。

double a = 3.14;
int b = static_cast<int>(a); // 基本类型转换

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

Derived d;
Base* b = static_cast<Base*>(&d); // 上行转换

 

b. dynamic_cast

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

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

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

注意: 1. dynamic_cast只能用于父类含有虚函数的类

             2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

 

 class A
 {
 public :
 virtual void f(){}
 };
 class B : public A
 {};
 void fun (A* pa)
 {
 // dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回
B* pb1 = static_cast<B*>(pa);
 B* pb2 = dynamic_cast<B*>(pa);
 cout<<"pb1:" <<pb1<< endl;
 cout<<"pb2:" <<pb2<< endl;
 }
 int main ()
 {
 A a;
 B b;
 fun(&a);
 fun(&b);
 return 0;
 }
c. reinterpret_cast

reinterpret_cast 用于进行低级别的、不安全的类型转换,通常用于指针类型之间的转换。它不会进行任何类型检查,转换后的结果依赖于具体的实现和平台。

int a = 10;
int* p = &a;
double* dp = reinterpret_cast<double*>(p); // 不安全的指针转换
d. const_cast

const_cast 用于移除对象的 const 或 volatile 修饰符。它只能用于指针或引用类型,且不能改变对象的实际类型。

const int a = 10;
int& b = const_cast<int&>(a); // 移除 const
b = 20; // 未定义行为,因为 a 是 const

3. 总结

  • 隐式转换 由编译器自动执行,适用于安全且自然的类型转换场景,但可能带来精度损失或数据截断的风险。
  • 显式转换 由程序员明确指定,提供了更细粒度的控制,但也需要谨慎使用以避免引入错误。
    • static_cast 是最常用的显式转换方式,适用于大多数类型转换需求。
    • dynamic_cast 用于在类层次结构中进行安全的向下转换。
    • reinterpret_cast 用于低级别的、不安全的转换,需谨慎使用。
    • const_cast 用于移除 const 或 volatile 修饰符,需谨慎使用以避免未定义行为

 

相关文章:

  • ArkTS基础语法:从声明到类型的深度解析
  • 系统与网络安全------网络通信原理(5)
  • nlp面试重点
  • 算法差分详解 + 总结
  • lx2160 LSDK21.08 firmware 笔记 - 1.bl31.bin 链接脚本 bl31.ld.S 分析
  • JavaWeb 课堂笔记 —— 09 MySQL 概述 + DDL
  • 基于贝叶斯方法的地震动分析及AI拓展
  • mysql安装-MySQL MGR(Group Replication)+ ProxySQL 架构
  • 前端 react+ant design ,后端 springboot +mysql+redis 全栈项目零基础小白从服务器初始化开始部署上线超详细保姆级教程
  • Ubuntu24.04 编译 Qt5 和 Qt6 源码
  • Android Cmake构建的项目,需不需要配置指定ndk及版本
  • 动态路由, RIP路由协议,RIPv1,RIPv2
  • MarkDown 输出表格的方法
  • 信息安全管理与评估2022国赛正式卷一阶段答案截图
  • [leetcode]第445场周赛
  • 亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结
  • SSH远程访问及控制
  • 数据结构——哈希详解
  • Pytorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(二)
  • Tkinter进度条与状态栏
  • 马上评|“衣服越来越难买”,对市场是一个提醒
  • 观察|本轮印巴冲突或促使印度空军寻求更先进战机
  • 广东早熟荔枝“抢滩”上海,向长三角消费者喊话:包甜,管够
  • 总没胃口,一吃就饱……别羡慕,也可能是生病了
  • 深入贯彻中央八项规定精神学习教育中央指导组完成进驻
  • 7月打卡乐高乐园,还可以去千年古镇枫泾参加这个漫画艺术季