C++回顾(十七)—— 类型转换

news2024/11/16 19:26:32

17.1 static_cast(expr)

  • static_cast强制类型转换
    用于基本类型间的转换,但不能用于基本类型指针之间的转换
    用于有继承关系类对象之间的转换和类指针之间的转换

  • static_cast是在编译期间转换的,无法在运行时检测类型
    所以类类型之间的转换有可能存在风险

在这里插入图片描述
在这里插入图片描述
完整示例代码:

#include <iostream>

using namespace std;

class Parent
{
};

class Child : public Parent
{
};

int main()
{
	int a = 1;
	char ch = 'x';

	a = static_cast<int>(ch);   //用于普通类型之间的转换

	//int *p = static_cast<int *>(&ch);  //不能用于普通类型指针之间的转换

	Parent p;
	Child c;

	p = static_cast<Parent>(c);   //用于有继承关系的类对象之间的转换
	Parent *p1 = static_cast<Parent *>(&c);    //用于类对象指针之间的转换   
	
	return 0;
}

17.2 reinterpret_cast(expr)

  • reinterpret_cast强制类型转换
    用于指针类型间的强制转换
    用于整数和指针类型间的强制转换
  • reinterpret_cast直接从二进制位进行复制,是一种极其不安全的转换

在这里插入图片描述
在这里插入图片描述
示例代码:

#include <iostream>

using namespace std;

int main()
{
	int b = 10;
	int a = 100;
	char *p = reinterpret_cast<char *>(&a);   //用于普通类型指针之间的转换(不安全)
	cout << *(p + 1) << endl;
	cout << *(&a + 1) << endl;

	int *q = reinterpret_cast<int *>(100);    //用于数字和指针之间的转换(很容易出现野指针)
	*q = 1;

	return 0;
}

17.3 const_cast(expr)

const_cast用于去除变量的const属性
在这里插入图片描述
示例代码:

#include <iostream>

using namespace std;

int main()
{
	const int a = 1;     //常量(在编译时就对a进行了替换,这里和C语言不同)
	// int *p = (int *)&a;
	int *p = const_cast<int *>(&a);
	*p = 100;
	cout << "a = " << a << endl; // a = 1;
	cout << "*p = " << *p << endl; // *p = 100;

	const int &m = 1;       
	int &n = const_cast<int &>(m);
	n = 100;
	cout << " m = " << m << endl; // m = 100;
	cout << " n = " << n << endl; // n = 100;

	const int x = 1;
	int &y = const_cast<int &>(x);
	y = 100;
	cout << "x = " << x << endl; // x = 1;;
	cout << "y = " << y << endl; // y = 100;

	return 0;
}

运行结果:
在这里插入图片描述
在C语言中:

#include <stdio.h>

int main() {
    const int a = 1;
    int *p = &a;
    *p = 100;

    printf("a = %d\n", a); // a = 100;
    printf("*p = %d\n", *p); // *p = 100;

    return 0;
}

在这里插入图片描述

17.4 dynamic_cast(expr)

dynamic_cast强制类型转换
主要用于类层次间的转换,还可用于类之间的交叉转换
dynamic_cast具有类型检查功能,比static_cast更安全

在这里插入图片描述
示例代码:

#include <iostream>

using namespace std;

class Parent
{
public:
	virtual void f()
	{
	}
};

class Child : public Parent
{
public:
	void f()
	{
	}
};

int main()
{
	Child *c = new Child;
	delete c;

	//c = static_cast<Child *>(new Parent);  //派生类指针指向基类对象(错误,但是编译器检查不出来)

	c = dynamic_cast<Child *>(new Parent);   //运行的时候做类型检查,如果不能转换,则返回NULL,比static_cast安全
	if (NULL == c)
	{
		cout << "强转失败" << endl;
	}
	else
	{
		cout << "强转成功" << endl;
		delete c;
	}

	return 0;
}

运行结果:
在这里插入图片描述

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

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

相关文章

002 第一季SpringBoot2核心技术-核心功能:

三、核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式。 1.1.2 yaml 1) 简介 YAML 是 “YAML Ain’t Markup Language”&#xff08;YAML 不是一种标记语言&#xff09;的递归缩写。在开发的这种语言时…

ArcGIS:栅格计算器的运算符和函数详解

01 栅格计算器在哪&#xff1f;02 运算符说明栅格计算器的表达式书写与Python语法一致&#xff08;由于其为解释型语言并且语言简洁优美&#xff0c;因此简单上手&#xff09;&#xff0c;这里主要简单说明各个运算符即可使用栅格计算器构建地图代数表达式以输出要求的栅格图像…

给力|这是一个专业的开源快速开发框架!

在低代码开发市场&#xff0c;专业的开源快速开发框架可以助力企业提升办公协作效率&#xff0c;实现提质增效的办公自动化的发展目标。 流辰信息低代码技术开发平台服务商&#xff0c;拥有丰富的技术经验和案例合作经验&#xff0c;针对不同的客户需求&#xff0c;提供个性化、…

Docker-数据卷之Dockerfile

dockerfile相当于一个脚本通过该脚本可以生成一个自定义的镜像Dockerfile命令:注意&#xff1a;Dockerfile中的指令必须都是大写#基础镜像&#xff0c;一切从这儿开始构建 FROM #镜像是谁写的&#xff0c;姓名邮箱 MAINTAINER #镜像构建时候需要运行的命令 RUN #步骤&#xff1…

Nginx 文件名逻辑漏洞(CVE-2013-4547)

注意&#xff1a;仅用于技术讨论&#xff0c;切勿用于其他用途&#xff0c;一切后果与本人无关&#xff01;&#xff01;&#xff01; 个人博客地址&#xff1a;HJW个人博客 理论基础&#xff1a; 建议提前学习nginx的原理&#xff1a;Nginx服务漏洞详解 - 知乎 漏洞原理&a…

【项目实战】如何使用Postman调用WebSocket程序

一、背景说明 项目中需要使用WebSocket进行通信&#xff0c;开发完了WebSocket接口&#xff0c;总得测试吧&#xff0c;以下是Postman调用WebSocket程序的方法。 二、注意事项 2.1 为啥选Postman&#xff1f; 最近都在用ApiFox做接口调用&#xff0c;但是目前版本的ApiFox&…

新库上线 | CnOpenData注册会计师及事务所数据

注册会计师及事务所数据 一、数据简介 注册会计师是指取得注册会计师证书并在会计师事务所执业的人员&#xff0c;从事审计、咨询、税务等相关业务。事务所是指依法在中国境内设立&#xff0c;由中国公民组成&#xff0c;具有独立法人资格&#xff0c;接受投资者和其他利害关系…

Python之webmagic爬虫优点与使用

一、webmagic的优点它更偏向于java的语法&#xff0c;对于熟悉java的工程师来说学习成本较低提供多种选择器&#xff0c;如css选择器、xpath、正则等有一个模块pipeline&#xff1a;可通过简单地配置&#xff0c;可以将爬虫抽取到的信息&#xff0c;持久化到文件、数据库等。二…

git 提交 多人开发避免冲突

代码正常提交 git add . git commit -m ‘备注信息’ git status 查看本地提交状态 git pull 拉取代码 git push origin master 指定远程仓库名和分支名 ‘’ 如果多人开发 A和B 提交避免冲突 B拉取代码修改内容直接提交后 A也修改了内容在git add / git commit / git pull / g…

新品发布 | 单细胞转录组学

单细胞转录组学测序(Single cell RNA-seq)&#xff1a;是对单个细胞的转录组进行研究的一项技术&#xff0c;其原理是将分离的单个细胞中微量的mRNA通过扩增后再进行高通量测序&#xff0c;主要用于研究异质性细胞的独特表型和生物学功能&#xff0c;有助于发现新的稀有细胞类型…

【JavaSE系列】 第九节 —— 多态那些事儿

文章目录 前言 一、多态的概念 二、向上转型和向下转型 2.1 向上转型 2.2 什么是向上转型 2.3 三种常见的向上转型 2.3.1 直接赋值 2.3.2 作为方法的参数 2.3.3 作为方法的返回值 2.4 向下转型&#xff08;这个了解即可&#xff09; 三、方法重写 3.1 方法重写的…

启动golang项目编译的exe可执行文件获取windows管理员权限(UAC)

背景&#xff1a; go代码启动以后里面涉及到修改ip地址等操作&#xff0c;需要管理员权限。打包好的exe文件双击执行默认是没有管理员权限的&#xff0c;那么修改ip就会提示需要管理员权限。 解决方法1&#xff1a;右键以管理员权限运行exe文件 解决方法2&#xff1a;编译exe…

前端jQuery ajax请求,后端node.js使用cors跨域

前言 跨域&#xff0c;一句话介绍&#xff1a; 你要请求的URL地址与当前的URL地址&#xff0c;协议不同、域名不同、端口不同时&#xff0c;就是跨域。 步入正题 前端&#xff0c;jQuery ajax请求 $.ajax({async: false,method: post,//URl和端口与后台匹配好&#xff0c;当…

点云分割预研

文章目录激光雷达点云分割1.点云分割主流方案&#xff08;模型角度&#xff09;1.1 (a) 基于RGB-D图像1.2 (d) 基于点云1.3 (b) 基于投影图像1.4 (b) 基于投影图像 - SqueezeSeg/RangeNet1.4. 球映射2 点云分割主流方案&#xff08;部署角度&#xff09;3 点云分割常用指标4 点…

MySQL 02 :三层结构、备份删除数据库

MySQL 02 &#xff1a;数据库三层结构-破除MySQL神秘 请添加图片描述 通过golang操作MySQL 创建删除数据库 备份恢复数据库 第一次需要配置环境&#xff0c;否则会报错 报错&#xff1a;mysqldump: Got error: 1045: Access denied for user ‘root’‘localhost’ (using …

HDLBits: 在线学习 SystemVerilog(二十三)-Problem 158-162(找BUG)

HDLBits: 在线学习 SystemVerilog&#xff08;二十三&#xff09;-Problem 158-162&#xff08;找BUG&#xff09;HDLBits 是一组小型电路设计习题集&#xff0c;使用 Verilog/SystemVerilog 硬件描述语言 (HDL) 练习数字硬件设计~网址如下&#xff1a;https://hdlbits.01xz.ne…

【LeetCode】《LeetCode 101》第二章:最易懂的贪心算法

文章目录2.1 算法解释2.2 分配问题455. 分发饼干 &#xff08;简单&#xff09;135. 分发糖果 &#xff08;困难&#xff09;2.3 区间问题435. 无重叠区间&#xff08;中等&#xff09;2.4 练习605. 种花问题&#xff08;简单&#xff09;452. 用最少数量的箭引爆气球&#xff…

FFmpeg介绍及入门知识

1、简介 FFmpeg是一套由c语言编写的&#xff0c;可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序,自身采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案&#xff0c;包含了非常先进的音频/视频编解码库libavcodec&#xf…

【Unity Android Platform:关于Android权限来源(安卓)如何查找】

Android权限来源 问题描述&#xff1a;当项目接入的插件逐渐变多&#xff0c;不仅仅是AndroidManifest会影响Android Permission的个数&#xff0c;甚至有些API也会影响最终的权限个数&#xff0c;例如下图所示&#xff1a; 当国内权限问题涉及到一些安全隐私问题时&#xff0…

构造函数与普通函数,显式原型与隐式原型,原型与原型链

原型与原型链1 学前先了解一些概念1.1 构造函数和普通函数的区别1.1.1 调用方式1.1.2 函数中this的指向不同1.1.3 写法不同1.2 问题明确2 原型与原型链2.1 原型2.2 显式原型与隐式原型2.3 原型链3 原型链环形结构1 学前先了解一些概念 1.1 构造函数和普通函数的区别 构造函数…