【C++】14.类型转换

server/2024/9/23 7:23:16/

我们常见的类型转化有:
1. 内置类型转化内置类型
2. 内置类型转化自定义类型
3. 自定义类型转化内置类型
4. 自定义类型转化自定义类型

本篇博客就是针对上述转化进行讲解……

一、内置类型转化内置类型

我们知道在C语言中支持浮点型向整型的隐式类型转化,也支持从地址常量向整型的转化,而C++孕育于C语言,他对这一部分也同样适配

void test1()
{double x = 1.08;int y = x;cout << y << endl;double* px = &x;y = (int)px;cout << y << endl;
}

二、内置类型转化自定义类型

这一部分在之前的博客中有所涉猎,例如在模拟string实现时,我们可以通过char*类型的字符串对string进行构造

void test2()
{string str("11111111");cout << str;
}

三、自定义类型转化内置类型

这种情况在一般状况下并不常见,例如输入输出流中的判断是否到达文件结尾,就是将其转化为了bool类型,如下:

class A
{
public:A(int x){_a = x;}operator int(){return _a;}
private:int _a;
};
void test3()
{A aa(1);int x = aa;cout << x;
}

四、自定义类型转化自定义类型

struct B
{B(int x):_b(x){}int _b;
};
class A
{
public:A(int x):_a(x){}A(const B& b):_a(b._b){}
private:int _a;
};void test4()
{B b(10);A a(b);
}

五、C++强制类型转化

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

5.1 static_cast

即隐式类型转化

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

5.2 reinterpret_cast

即强制类型转化

int main()
{double d = 12.34;int a = static_cast<int>(d);cout << a << endl;int *p = reinterpret_cast<int*>(a);return 0;
}

5.3 const_cast

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

void Test ()
{const int a = 2;int* p = const_cast< int*>(&a );*p = 3;cout<<a <<endl;
}

5.4 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;
}

注意
强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。强烈建议:避免使用强制类型转换

六、RTTI

RTTI:Run-time Type identification的简称,即:运行时类型识别。
C++通过以下方式来支持RTTI:
1. typeid运算符
2. dynamic_cast运算符
3. decltype


http://www.ppmy.cn/server/107400.html

相关文章

AI绘画工具 Stable Diffusion【插画转绘】:建筑 | 风景| 人像照片的插画转绘制作教程,照片秒变插画风格图片!

大家好&#xff0c;我是画画的小强 关于Stable Diffusion 的插画转绘&#xff0c;今天给大家分享一种制作方法。我们先看一下效果图。 一. 图片转插画的制作方法 本期教程我们将使用AI绘画工具Stable Diffusion&#xff0c;关于SD的安装和入门使用可以看看我的往期入门教程…

React——useRef()

useRef 是 React 的一个 Hook&#xff0c;用于在组件的整个生命周期内持久化保存数据。主要有以下几个用途&#xff1a; 存储对 DOM 节点的引用&#xff1a;通过给 DOM 元素添加 ref 属性来直接访问实际的 DOM 节点。这常用于需要直接操作 DOM 时&#xff0c;比如管理焦点、文本…

【软件】常用软件教程一:码云(Gitee)使用方法

文章目录 一、简介二、创建远程仓库三、配置SSH公钥四、同步 Gitee 仓库内容到本地五、本地新建文件并同步至 Gitee六、删除远程仓库中的指定文件七、常见代码 一、简介 Git 是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更。它是由 Linus Torvalds 创建的&…

Redis key的过期时间和永久有效

Redis key的过期时间和永久有效 设置键的过期时间 1. **使用 EXPIRE 命令**&#xff1a; EXPIRE 命令用于设置一个键的过期时间&#xff08;以秒为单位&#xff09;。 **语法**&#xff1a;shellEXPIRE key seconds **示例**&#xff1a;shellEXPIRE mykey 60 上述命令将 …

[Algorithm][综合训练][比那名居的桃子][chika和蜜柑][礼物的最大价值]详细讲解

目录 1.比那名居的桃子1.题目链接2.算法原理详解 && 代码实现 2.chika和蜜柑1.题目链接2.算法原理详解 && 详细讲解 3.礼物的最大价值1.题目链接2.算法原理详解 && 代码实现 1.比那名居的桃子 1.题目链接 比那名居的桃子 2.算法原理详解 && …

黑神话悟空丨资源合集,光追配置+修改器+各种奇奇怪怪的MOD

国产3A大作 黑神话悟空 推出了一些奇奇怪怪的mod(非官方)&#xff0c;作为一款备受瞩目的单机作品&#xff0c;黑神话悟空 不仅在剧情和画面上表现出色&#xff0c;同时也为玩家提供了丰富的Mod支持。 哈哈哈哈&#xff0c;总是就是奇奇怪怪&#xff0c;悟空被玩坏了&#xff…

【快速选择算法】解决TopK问题中前K小的数字问题

目录 1.前言2.题目简介3.求解思路4.示例代码 1.前言 在一个数组中找到这个数组前K小的数字有三种方式&#xff1a; 排序 O(N*logN)堆排序&#xff1a;建立一个k个大小的大堆(如果是找前K大的数字的话用小堆) O(N*logK)快速选择算法&#xff1a;原地交换数字&#xff0c;使得该…

Dubbo源码解析之@DubboService、@DubboReference(Dubbo源码一)

更好的阅读体验&#xff1a;Dubbo源码解析之DubboService、DubboReference&#xff08;Dubbo源码一&#xff09; 视频讲解&#xff1a;https://www.bilibili.com/video/BV1nBsMejEbL 对于Dubbo用的最多的就是DubboService、DubboReference&#xff0c;与之对应的就是服务的提供…