C++静态转换

news2024/11/25 12:34:40

目录

1.1基本类型间的转换

1.2指针转换的限制

1.3空指针的转换

1.4弃值表达式

1.5左值转到右值

1.6类层次结构基类和派生类间的指针或引用转换


用法:static_cast<type_name> (expression) 说明:该运算符把expression转换为type_name类型static_cast 在编译时使用类型信息执行转换在转换执行必要的检测诸如指针越界计算,类型检查等);但没有运行时类型检查来保证转换的安全性。

1.1基本类型间的转换

enum WeekType{sum=0,mon=1,tues,wed,thurs,fir,sat};
int main()
{
    int a=10;
    char ch='a';
    double dx=12.23;
    a=static_cast<int>(ch);//ok
    ch=static_cast<char>(a);//ok
    a=static_cast<int>(dx);//ok
    dx = static_cast<double>(a);//ok
    WeekType x=mon;
    a=x;//ok
    x=a;//error
    x=static_cast<WeekType>(a);//ok
	return 0;
}

1.2指针转换的限制

对于不同类型的指针不能相互转换,空指针和类的继承层次中的父子类指针是个特例

int main()
{
    int a=10;
    double dx=12.23;
    int* p=&a;
    int* s=static_cast<int*>(&a);//ok 
    s=static_cast<int*>(&dx);//error
    const int* cip=&a;
    s=static_cast<int*>(cip);//error
    char* cp=static_cast<char*>(p);//error,指针类型不同不能转换。
}

1.3空指针的转换

void*可以转换为其他类型

int main()
{
    int a=10;
    int* ip=nullptr;
    double* dp=nullptr;
    void* vp=&a;//ok
    vp=&ip;//ok
    vp=&vp;//ok
    ip=vp;//error
    dp=vp;//error
    ip=static_cast<int*>(vp);//ok
    dp=static_cast<double*>(vp);//ok
}

1.4弃值表达式

int main()
{
    int a=10,b=20;
    static_cast<void>(a+b);//ok,弃值表达式
    int c=static_cast<void>(a+b);//error,将a+b的值转换为void类型
    
}

1.5左值转到右值

int main()
{
    int a=10;
    int& x=a;//ok
    int&& rx=a;//error,a为左值不能被右值引用引用
    int&& rx=static_cast<int&&>(a);//ok
    int&& ry=std::move(a);//ok
    //但是给变量加上常性就会出现问题
    const int b=20;
    int&& rx=static_cast<int&&>(a);//error
    int&& ry=std::move(a);//error
}

对于强转、静态转换、移动函数间对于左值转换为右值过程中的不同在附加中给出。

1.6类层次结构基类和派生类间的指针或引用转换

进行上行转换(把派生类的指针或引用转换为基类)是安全的;

进行下行转换(把基类指针或引用转换为派生类表示)时,由于没有动态类型检查,所以不安全。

class Object
{
    int value;
public:
	Object(int x=0):value(x){}
    void func(){}
    virtual void func()
    {
        cout<<"Object::func"<<endl;
    }
};
class Base:public Object
{
    int num;
public:
	Base(int x=0):Object(x+10),num(x){}
    void show()const{}
    virtual void func()
    {
        cout<<"Base::func"<<endl;
    }
};
int main()
{
    Object* op=nullptr;
    Base* bp=nullptr;
    Base base;
    Object obj;
    op=&obj;
    bp=&base;
    op=static_cast<Object*>(&base);//ok
    //下行转换:基类转换为派生类;(是不安全的,没有动态类型检查
    bp=static_cast<Base*>(&obj);//编译通过,但本事存在安全问题。因为bp在解引用时是按照8字节取值,而obj对象占四字节,这样会使得num的值为随机值。
}

 下行转换的安全问题还有一个

int main()
{
    Object* op=nullptr;
    Base* bp=nullptr;
    Base base;
    Object obj;
    op=&obj;
    bp=&base;
    bp=static_cast<Base*>(&obj);
    bp->func();//打印Object::func
}

 

原因就是在下行转换时没有进行安全检查,调用func时依然查的是obj的虚表。

注意: 隐式执行任何类型转换都可由static_cast显示完成。static_cast不能转换掉expression的const、volatile、或者 unaligned属性。

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

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

相关文章

ElasticSearch核心详解、文档、查询响应、分页、映射、结构化查询

目录 ElasticSearch核心详解文档元数据&#xff08;metadata&#xff09;index_type_id 查询响应pretty指定响应字段判断文档是否存在 批量操作批量查询_bulk操作 分页映射创建明确类型的索引&#xff1a;测试搜索 结构化查询term查询terms查询range查询exists 查询match查询bo…

Linux 虚拟文件系统 VFS 源码剖析

转自&#xff1a;Linux 虚拟文件系统 VFS 源码剖析 -- 以 ext4 为例&#xff08;Part1&#xff09; - 知乎 虚拟文件系统&#xff08;Virtual File System, VFS&#xff09;是 Linux 内核的一个组件&#xff0c;用于处理与文件和文件系统相关的所有系统调用。VFS 是内核提供文…

架构师怎样绘制系统架构蓝图?

首先&#xff0c;请你设想这样一个场景&#xff1a;如果公司安排你做架构师&#xff0c;要你在项目开发前期进行软件架构设计&#xff0c;你该如何开展你的工作&#xff1f;如何输出你的工作成果&#xff1f;如何确定你的设计是否满足用户需求&#xff1f;你是否有把握最后交付…

人工智能导论复习

Sell Out - Twoset Violin - 单曲 - 网易云音乐 (163.com) 目录 1 归结演绎推理 子句集&#xff1a; 归结&#xff1a; 2 可信度分析 CF模型 加权的不确定性推理 3 模糊推理-构造 扎德方法构造模糊关系 4 A* 5 遗传算法 6 神经网络 1 归结演绎推理 归结推理&#xff…

【ZooKeeper快速入门】 —— 每天一点小知识

&#x1f4a7; Z o o K e e p e r 快速入门 \color{#FF1493}{ZooKeeper快速入门} ZooKeeper快速入门&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

GPU 并行计算入门

文章目录 0. 前言1. CPU vs GPU2. 并行计算简介3. CUDA 简介4. CUDA 的处理流程 0. 前言 在没有GPU之前&#xff0c;基本上所有的任务都是交给CPU来做的。有GPU之后&#xff0c;二者就进行了分工&#xff0c;CPU负责逻辑性强的事物处理和串行计算&#xff0c;GPU则专注于执行高…

chatgpt赋能python:Python如何横着输入优化网站SEO

Python如何横着输入优化网站SEO 简介 Python作为一种强大的编程语言&#xff0c;在网络开发、数据处理、机器学习、人工智能等领域得到了广泛应用。随着互联网的发展&#xff0c;优化网站SEO已成为网站管理者不可或缺的重要职责&#xff0c;而如何横着输入也是优化SEO的重要一…

chatgpt赋能python:Python求平方:简单方便的方法

Python求平方&#xff1a;简单方便的方法 Python是一种功能强大、易学易用的编程语言&#xff0c;许多人使用它来进行数学计算。在Python中求一个数的平方是非常简单的。本文将介绍一些方法来实现这一任务。 使用**操作符 Python中的**操作符是求平方的快捷方式。它将一个数…

Golang每日一练(leetDay0097) 顶端迭代器、寻找重复数

目录 284. 顶端迭代器 Peeking Iterator &#x1f31f;&#x1f31f; 287. 寻找重复数 Find the Duplicate Number &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练…

应聘求职自荐信优秀范文5篇

应聘求职自荐信优秀范文篇1 尊敬的领导&#xff1a; 您好!衷心的感谢您在百忙之中翻阅我的这份材料&#xff0c;并祝愿贵单位事业欣欣向荣&#xff0c;蒸蒸日上! 我是哈尔滨理工大学测控技术及通信工程学院________届毕业生&#xff0c;自从今日大学之后&#xff0c;高考后的轻…

【MySQL数据库 | 第十八篇】索引分类与语法

前言&#xff1a; 在上一篇我们讲解了什么是索引以及索引的结构&#xff0c;这一篇我们将更进一步的讲解索引的分类以及语法介绍&#xff0c;大家准备好了嘛&#xff1f; 索引分类&#xff1a; 1. 主键索引 主键索引是一种特殊的唯一索引&#xff0c;它强制保证某列的值…

chatgpt赋能python:Python-查看已安装的库

Python - 查看已安装的库 Python 作为一种流行的编程语言&#xff0c;具有丰富的标准库和大量的第三方库&#xff0c;这些库可以方便地进行开发&#xff0c;缩短开发周期并提高代码质量。但是&#xff0c;随着时间的推移和项目累积&#xff0c;我们可能会忘记在当前机器上已经…

【瑞萨RA_FSP】电位器电压采集

文章目录 一、硬件设计二、软件设计1. 文件结构2. FSP配置3. ADC初始化函数4. ADC中断回调函数5. 如果未启用中断6. ADC读取转换结果函数7. hal_entry入口函数 一、硬件设计 野火启明6M5开发板的 ADC 电位器电路图如图所示。 可知&#xff0c;开发板板载的电位器连接到 P000 …

随机森林特征重要性(Variable importance)评估方法

Random Forest Variable importance 算法介绍实现算法流程分类回归 实验实验1&#xff1a;waveform数据集&#xff08;分类&#xff09;实验2&#xff1a;superconductivity数据集&#xff08;回归&#xff09;实验3&#xff1a;power-consumption数据集&#xff08;回归&#…

UNIX环境高级编程——进程间通信

15.1 引言 本章将说明进程之间相互通信技术——进程间通信&#xff08;InterProcess Communication&#xff0c;IPC&#xff09;。 IPC类型包括&#xff1a; 前10种IPC形式通常限于同一台主机的两个进程之间的IPC&#xff1b;最后2种是仅有的支持不同主机上两个进程之间的I…

5G NR SRS功率控制

3GPP TS 38.213 7.3.1节中&#xff0c;关于SRS的功率控制算法如下&#xff1a; 其中&#xff0c; : 表示在载波f服务小区c以及SRS的发送时隙i UE被配置的最大发射功率&#xff1b; : 表示在载波f&#xff0c;BWP b, 服务小区c&#xff0c;SRS资源集qs所配置的p0值&#xff1…

【GateWay快速入门】 —— 每天一点小知识

&#x1f4a7; Z o o K e e p e r 快速入门 \color{#FF1493}{ZooKeeper快速入门} ZooKeeper快速入门&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

子线程不显示Toast?

Handler不仅在ANR过程中有用到&#xff0c;Toast中也用到了Handler。 代码如下&#xff1a; public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.lay…

chatgpt赋能python:Python如何进行高效的查询?

Python如何进行高效的查询&#xff1f; 在Python中&#xff0c;查询是一项非常常见的操作&#xff0c;而高效的查询在数据量增大时可以显著提高程序的性能和效率。本文将介绍Python中的查询方式以及如何进行高效的查询操作。 Python中的查询方式 Python中查询的方式主要分为…

嵌入式容器源码解析

问题分析 不同于使用springmvc,在我们使用springboot时无需配置tomcat就可以直接使用&#xff0c;这就说明springboot已经在我们启动项目时将tomcat配置好了&#xff0c;接下来我们就来看看springboot底层是怎么实现的。 源码解析 ServletWebServerFactoryAutoConfiguratio…