C++新特性07_强制转换static_cast(隐式转换:基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方;大端序、小端序;适用于低风险转换及子类转父类)

2023-11-19

本篇将会介绍static_cast,这种转换方式和以前学习的隐式转换很相似,基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方。

1. 隐式转换

在C语言中,存在不通过强制转换就可以将类型进行转换的隐式转换。
例子:

int main() {
	int n = 5;
	float f = 10.0f;
	
	//本质上发生了隐式转换,将int类型的5转换为float类型
	f = n;

	return 0;
}

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

2. 计算机数据存储方式

计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。

  • 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

  • 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

例子:对于内存中存放的数0x12345678来说
如果是采用大端模式存放的,则其真实的数是:0x12345678
如果是采用小端模式存放的,则其真实的数是:0x78563412
在这里插入图片描述
数据以浮点编码格式,小端序进行保存
在这里插入图片描述

3. static_cast

对于上面的隐式转换还是需要人为的去思考转换类型,C++提供了关键字static_cast来明确正在进行隐式转换。

写法如下:

	//static_cast作用等价于隐式转换,但是更加明确
	f = static_cast<float>(n);

基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方。简单一些的理解就是:将隐式转换显式化表示出来

3.1 可以与不可以转换的情况

  • 可以用于低风险的转换:
    整型与浮点型、字符与整形、转换运算符、空指针转换为任何目标类型的指针

  • 不可以用与风险较高的转换:
    不同类型的指针之间互相转换、整型和指针之间的互相转换、不同类型的引用之间的转换


#include <iostream>
#include <string>

class CInt {
public:
	//对int的转换运算符
	operator int() {
		return m_nInt;
	}

	int m_nInt;
};

int main() {
	int n = 5;
	float f = 10.0f;
	double dbl = 1.0;
	
	//本质上发生了隐式转换,将int类型的5转换为float类型
	//但是代码上写的不够明确
	f = n;

	//static_cast作用等价于隐式转换,但是更加明确
	f = static_cast<float>(n);

	//低风险的转换
	//整型与浮点型
	n = static_cast<int>(dbl);

	//字符与整型
	char ch = 'a';//占用一个字节
	n = static_cast<int>(ch);

	//void*指针的转换
	void* p = nullptr;
	int* pN = static_cast<int*>(p);

	//转换运算符的方式
	CInt nObj;
	//若没有前面的,这里会把nObj当做对象无法转换
	//等价于int kk=nObj
	int k = static_cast<int>(nObj);

	//高风险的转换
	int kk;
	char* p;
	//整型与指针类型的转换
	p = kk;//不可以转换
	char* k = static_cast<char*>(kk);//不可以转换

	//不同指针类型的转换
	int* pK;
	char* k = pK;//不可以转换
	char* k = static_cast<char*>(pK);//不可以转换

	return 0;
}

3.2 基类与派生类之间的转换

实现结果如下:


#include <iostream>
#include <string>

//基类与派生类之间的转换

class CFather
{
public:
	CFather() {
		m_nTest = 3;
	}

	virtual void foo() {
		std::cout << "CFather()::void foo()" << std::endl;
	}

	int m_nTest;
};

class CSon : public CFather
{
	virtual void foo() {
		std::cout << "CSon::void foo()" << std::endl;
	}
};

int main() {
	CFather* pFather = nullptr;
	CSon* pSon = nullptr;

	//父类转子类,不安全,子类可能包含的内容更多
	//pSon = pFather;//无法通过
	//pSon = static_cast<CSon*>(pFather);//可以通过,但是不安全,没有运行时的检测

	//子类转父类,安全,子类包含的内容要大于子类
	//pFather = pSon;//可以通过
	//pFather = static_cast<CFather*>(pSon);//可以通过
}

4.学习视频地址:强制转换static_cast

5.学习笔记:强制转换static_cast学习笔记

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++新特性07_强制转换static_cast(隐式转换:基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方;大端序、小端序;适用于低风险转换及子类转父类) 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 字符串转换时间,时区问题

    1 字符串转化为时间 解决了关于相差8个小时的时区问题 NSString dateStr 2012 05 17 11 23 23 NSDateFormatter format NSDateFormatter alloc init forma
  • TP5使用predis

    1 安装 composer require predis predis 2 使用 use use Predis Client class Index 使用predis public function index 配置连接的IP 端口 以及相
  • 【数据结构】树的遍历

    Ctrl AC 一起 AC 目录 树有三种表示方法 树的遍历有三种 结点结构 树的前序遍历递归版 树的后序遍历递归版 按前序遍历顺序建立一颗树 树的层次遍历 树有三种表示方法 双亲表示法 孩子表示法和兄弟表示法 这里我们使用指针式的孩子表示
  • Unity震撼首发,最新一代高清数字人短片《Enemies》

    我们屡获殊荣的 Demo 团队又一次在 异教徒 The Heretic 累积了超 400 万观众 的基础上取得了进展 推出了 Enemies 一支全新的电影式预告片 以 4K 分辨率的实时渲染来展示眼睛 头发和皮肤渲染等方面的重大突破 创建
  • 大逃杀显示服务器崩溃,绝地求生大逃杀崩溃问题汇总 崩溃问题及完美解决方案...

    国外的游戏在中国的电脑和配置上玩起来都会有点卡顿的 闪退或者崩溃的情况都是常有的 那么在玩游戏中崩溃了怎么办呢 大家赶紧来看看绝地求生大逃杀崩溃问题汇总 崩溃问题及完美解决方案 前提准备 关闭杀毒 游戏使用BE反作弊系统 杀毒软件可能会拦截
  • 网址,URL,域名,IP地址,DNS,域名解析,只为你能成功访问

    计算机网络 计算机专业必修科目之一 是专业课 但是 很多的人除了进入浏览器 输入网址 然后回车就看到页面了 然后往下操作 基本没怎么关注过它的原理 但是 你回车之后 网络内部真的是发生了很多的事情 只是你不知道 今天 我就带大家解开网络的神
  • Android平台GB28181设备接入侧(编码前

    在之前 我有写过Android平台GB28181设备接入模块的好多blog 包括参数设置 功能支持与扩展等 以数据接入为例 支持的数据类型涉及编码前 编码后或直接流数据 RTSP或RTMP流 可用于如智能监控 智慧零售 智慧教育 远程办公
  • HTTPRunner学习笔记

    HttpRunner 是一款面向 HTTP S 协议的通用测试框架 只需编写维护一份 YAML JSON 脚本 即可实现自动化测试 性能测试 线上监控 持续集成等多种测试需求 在yaml文件中组织测试用例 在命令行执行 参考 HTTPRun
  • Wazuh agent的安装、注册与配置管理

    部署Wazuh Agent常用的环境变量 Linux系统下的常用环境变量 WAZUH MANAGER WAZUH MANAGER PORT WAZUH PROTOCOL WAZUH REGISTRATION SERVER WAZUH REG
  • vue 3 第三十四章:nextTick

    nextTick是Vue3中的一个非常有用的函数 它可以在下一次DOM更新循环结束后执行回调函数 这个函数可以用来解决一些异步更新视图的问题 例如在修改数据后立即获取更新后的DOM节点 以下是一个简单的示例
  • BUUCTF【Web】Exec(命令执行漏洞)

    在进入靶场后发现窗口ping 猜测可能是SQL注入 也有可能是命令执行漏洞 我们先随便ping一下本机地址127 0 0 1 发现有回显 PING 127 0 0 1 127 0 0 1 56 data bytes 既然有回显那么就可以确定
  • 前端做excel的录入解析,将excel的数据传给后端,显示在页面上。

    具体的流程如图所示 1 点击excel录入按钮 2 打开弹框 3 点击上传按钮 会自动打开计算机本地文件 选择想上传的文件 点击打开 4 会将excel的数据解析成一个表格 可以在表格中做删除操作 点击确定 5 将excel的人员与系统中的
  • Redis cluster集群搭建

    通过三台虚拟机搭建一个3主3从的cluster集群 1 安装 gcc c 依赖包 yum install gcc c 2 下载安装包并解压 wget https download redis io releases redis 6 0 9
  • Max Flow P

    Max Flow P 题目传送门 题目大意 题目大意就是给你一棵树 再给你K次操作将x到y的所有点的值都加1 然后输出所有点值的最大值 思路 这一题如果用暴力的话从范围来看肯定会T tle 所以我们要考虑用差分的思想去做 代码 先看代码 i
  • L2-1 分而治之PTA

    分而治之 各个击破是兵家常用的策略之一 在战争中 我们希望首先攻下敌方的部分城市 使其剩余的城市变成孤立无援 然后再分头各个击破 为此参谋部提供了若干打击方案 本题就请你编写程序 判断每个方案的可行性 输入格式 输入在第一行给出两个正整数
  • gdb attach 使用方法介绍

    1 假设进程 mcs 已启动 2 ps ef grep mcs 查询mcs进程号 获取进程号xxxx 3 gdb attach xxxx 进程号 attach到已启动的进程上 4 gdb stop 先暂停那个子进程 然后设置一些断点和一些W
  • arp,udp,icmp编码实现理解

    一直关注tcp ip的底层协议栈 终于有了大概的了解 通过ntytcp了解tcp相关的底层实现 发现除了tcp协议栈相关的东西 还有udp arp icmp ping命令相关 以及通过netmap对网卡数据进行接收的相关基础知识点 幸好 听
  • 分布式 dataX 详细 (落地) 设计

    1 背景 分布式 DataX 基于 datax 打造的语义分分布式 ETL 平台 Datax 提供 reader framework writer 框架 方便开发两种异构数据源数据同步 但开源的 datax 缺少分布式特性 本文介绍基于 e
  • leaftlet 标签和弹框

  • C++新特性07_强制转换static_cast(隐式转换:基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方;大端序、小端序;适用于低风险转换及子类转父类)

    本篇将会介绍static cast 这种转换方式和以前学习的隐式转换很相似 基本等价于隐式转换的一种类型转换运算符 可使用于需要明确隐式转换的地方 C 新特性07 强制转换static cast 1 隐式转换 2 计算机数据存储方式 3 s