static_cast,dynamic_cast,const_cast详解

news2024/11/27 4:16:43

目录

一.static_cast(静态转换)

二.dynamic_cast(动态转换)

三.const_cast


一.static_cast(静态转换)

1.语法:

static_cast<new_type>(expression);
newtype dataname = static_cast<newtype>(expression);

new_type为目标数据类型,expression为原始数据类型变量或者表达式

2.解析:

static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐式转换如non-const对象转为const对象,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性

3.用法:

①.用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;(派生类拥有基类的所有data member,所以上行转换是安全的)
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。(基类没有派生类的data member,所以下行转换是不安全的)
②.用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。
③.把空指针转换成目标类型的空指针。
④.把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性

4.示例:

#include<iostream>
#include<typeinfo>
using namespace std;

class base
{
};

class derived:public base
{
};

int main()
{
	base b1;
	derived d1;
	//上行转换
	cout << "d1转换前的类型:" << typeid(d1).name() << endl;
	base b2 = static_cast<base>(d1);
	cout<<"d1转换后的类型:"<< typeid(b2).name() << endl;

	int a = 10;
	cout << "a转换前的类型:" << typeid(a).name() << endl;
	double b = static_cast<double>(a);
	cout << "a转换后的类型:" << typeid(b).name() << endl;

	system("pause");
	return 0;
}

二.dynamic_cast(动态转换)

1.语法:

type必须是一个类类型且必须是一个有效的指针

dynamic_cast< type* >(e)

type必须是一个类类型且必须是一个左值

dynamic_cast< type& >(e)

type必须是一个类类型且必须是一个右值

dynamic_cast< type&& >(e)

e的类型必须符合以下三个条件中的任何一个:
①.e的类型是目标类型type的公有派生类
②.e的类型是目标type的共有基类
③.e的类型就是目标type的类型。

new_type为目标数据类型,expression为原始数据类型变量或者表达式

2.解析:

①.dynamic_cast主要用于类层次间的上行转换下行转换,还可以用于类之间的交叉转换(cross cast)

②.在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能(dynamic_cast也是一个RTTI运算符),比static_cast更安全。dynamic_cast是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

3.示例:

#include<iostream>
#include<typeinfo>
using namespace std;

class base
{
};

class derived:public base
{
};

int main()
{
	derived *d1= new derived;
	cout << "d1转换前的类型:" << typeid(d1).name() << endl;
	base* b1 = dynamic_cast<base*>(d1);
	cout << "d1转换后的类型:" << typeid(b1).name() << endl;

	delete d1;

	system("pause");
	return 0;
}

三.const_cast

1.语法:

const_cast<type>(varible);

其中的type类型必须是指针、引用、或者指向对象类型成员的指针

const_cast用于将对象的常量属性转除,使常量可以修改。

2.示例:

 type类型必须是指针、引用或者指向对象类型成员的指针

#include<iostream>
using namespace std;

int main()
{
	const int &a = 10;
	cout <<"const_cast修改之前a的值:"<< a << endl;
	const_cast<int&>(a) = 5;
	cout << "const_cast修改之后a的值:" << a << endl;
	const_cast<int&>(a) = 20;
	cout << "const_cast二次修改之后a的值:" << a << endl;

	system("pause");
	return 0;
}

 

其中:

const_cast可以修改定义为const的常量,但仅限于通过const_cast<>()语法进行修改,而不是消除了常量的const属性使得其可以在任意地方进行修改。

总结:

尽量减少转换操作的使用,转换操作耗时较高(特别是dynamic_cast),大量使用会导致性能的下降,尽量使用其他方法代替。

参考文章:(58条消息) static_cast和dynamic_cast详解_ShyHerry的博客-CSDN博客_dynamic_cast

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

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

相关文章

分享133个ASP源码,总有一款适合您

ASP源码 分享133个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 133个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1l_8UHQkosNF3HHTu8AFq5A?pwdyxvw 提取码&#x…

欧几里得与扩展欧几里得算法(含推导过程及代码)

文章目录前言一、欧几里得算法二、扩展欧几里得算法2.1、认识裴蜀定理2.2、推导axbygcd(a, b)得到x与y2.2.1、推导过程2.2.2、代码实现2.3、推导axbygcd(a, b)的所有解及a或者b的最小值&#xff08;结论验证&#xff09;参考文章前言 在学习Acwing c蓝桥杯辅导课第八讲数论-Ac…

Spark 常用算子02

常用Action算子 1、countByKey算子 功能&#xff1a;统计key出现的次数&#xff08;一般适用于KV型的RDD&#xff09; 用法&#xff1a; result rdd1.countByKey() print(result)代码示例&#xff1a; # coding:utf8from pyspark import SparkConf, SparkContextif __name…

破解五角大楼3.0漏洞赏金计划专注于设施控制系统

国防部正在计划其“黑掉五角大楼”计划的第三次迭代&#xff0c;重点是找出维持标志性建筑和地面运行的操作技术中的漏洞。 国防部于 2016 年启动了黑客入侵五角大楼计划&#xff0c;供应商 HackerOne 协调了该部门公共网站上的漏洞赏金计划。 超过 1,400 名黑客参加了第一轮…

绝对空前!!!互联网史上的最大ddos攻击惊艳登场

美国遭遇史上最大黑客攻击&#xff0c;知名网站全部瘫痪。全世界一半的网络被黑客攻陷&#xff0c;大网站无一幸免。就在&#xff08;10月22日&#xff09;&#xff0c;美国早上我们见证了互联网建立以来的最大ddos攻击&#xff0c;twitter、netflix、paypal、reddit、pinteres…

【MySQL】锁

文章目录基础MyISAM表锁并发插入锁调度策略InnoDB事务并发事务行锁行锁争用情况行锁实现方式恢复和复制对InnoDB锁机制的影响死锁MVCC底层实现和原理悲观锁和乐观锁基础 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff08;避免争抢&#xff09;。在数据库中&…

一文打通java线程

基本概念&#xff1a;程序、进程、线程 程序(program) 是为完成特定任务、用某种语言编写的一组指令的集合。即指一 段静态的代码&#xff0c;静态对象。 进程(process) 是程序的一次执行过程&#xff0c;或是正在运行的一个程序。是一个动态的过程&#xff1a;有它自身的产…

Linux常用命令——sort命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sort 将文件进行排序并输出 补充说明 sort命令是在Linux里非常有用&#xff0c;它将文件进行排序&#xff0c;并将排序结果标准输出。sort命令既可以从特定的文件&#xff0c;也可以从stdin中获取输入。 语法…

文本情感分类TextCNN原理+IMDB数据集实战

1.任务背景 情感分类&#xff1a; 发展历程&#xff1a; 2.数据集 本次使用IMDB数据集进行训练。 3.模型结构 3.1 CNN基础 卷积&#xff1a; 单通道卷积&#xff1a;每组卷积核只包含一个。 单通道输入 单输出&#xff1a;设置一组卷积核。 单通道输入 多输出&#xff1a;…

国企避坑:to B服务性质的业务线不要来!又卷又累,互联网和它比简直是小巫见大巫!...

国企好归好&#xff0c;但不是所有的国企都能闭眼入&#xff0c;一位网友友情提示大家&#xff1a;不管是国企还是央企&#xff0c;to b服务性质的业务线不要来&#xff0c;不要来&#xff0c;不要来&#xff01;又卷又累&#xff0c;苦哈哈&#xff0c;互联网和这个比&#xf…

在CSS世界的权力——权重

在CSS的世界中也存在着权力即CSS权重 1. 概念 CSS权重指的是样式的优先级&#xff0c;有两条或多条样式作用于一个元素&#xff0c;权重高的那条样式对元素起作用&#xff0c;权重相同的&#xff0c;后写的样式会覆盖前面写的样式 2. 以前的BUG 在实际开发中&#xff0c;我…

代码随想录--双指针章节总结

代码随想录–双指针章节总结 1.LeetCode27 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 …

C++程序设计——动态内存管理

一、C/C内存分布 1.栈&#xff08;堆栈&#xff09; 存储非静态局部变量、函数参数、返回值等等&#xff0c;栈是向下增长。 2.内存映射段 是高效的I/O映射方式&#xff0c;用于转载一个共享的动态内存库。用户可使用系统接口创建共享内存&#xff0c;做进程间通信。 3.堆 用…

WPS的简单JS宏应用

有一阵子没写博客了&#xff0c;各种琐事忙碌&#xff1b;前段时间接触了下WPS的宏功能&#xff0c;抽点时间写个学习笔记吧。 案例背景简单说一下&#xff0c;主任让我统计OA后台在建工程项目的概况&#xff0c;后台数据导出一张表&#xff0c;再问隔壁经营部的同事要了一张中…

java类的初始化2023018

类的初始化&#xff1a; 第一次使用某个类&#xff0c;例如Person类&#xff0c;系统通常会在第一次使用Person类时加载这个类并初始化这个类。在类的准备阶段&#xff0c;系统将会为该类的类变量分配内存空间&#xff0c;并指定默认初始值。当Person类初始化完成后&#xff0c…

机器学习笔记之深度玻尔兹曼机(二)深度玻尔兹曼机的预训练过程

机器学习笔记之深度玻尔兹曼机——深度玻尔兹曼机的预训练过程引言深度信念网络预训练过程的问题深度玻尔兹曼机的预训练过程(2023/1/24)引言 上一节介绍了玻尔兹曼机系列的相关模型&#xff0c;本节将介绍深度玻尔兹曼机的预训练过程。 深度信念网络预训练过程的问题 在玻尔…

Escher 愛雪磁磚設計法則 - 高雄燕巢深水國小科展指導

“Talk is cheap. Show me the code.” ― Linus Torvalds 老子第41章 上德若谷 大白若辱 大方無隅 大器晚成 大音希聲 大象無形 道隱無名 拳打千遍, 身法自然 “There’s no shortage of remarkable ideas, what’s missing is the will to execute them.” – Seth Godin …

GreenPlum AOCO列存如何将数据刷写磁盘

GreenPlum AOCO列存如何将数据刷写磁盘AOCO列存表每个字段一个文件&#xff0c;前面我们介绍了列存表如何加载数据页&#xff0c;本文我们重点介绍AOCO表如何进行刷写。AOCO表进行insert、update、delete会产生脏数据&#xff0c;和heap表的异步脏页刷写不同&#xff0c;AOCO表…

写一个锅炉温控系统用python编写

简单来说就是锅炉水热了之后循环泵自动开启,然后将热水输送走,送到暖气,热水抽走,凉水进入锅炉,温度降低,循环泵关闭,等待下一次水烧热。因为需要取暖的房子距离烧锅炉的地方比较远,所以需要循环泵,如果距离近的话水烧热后利用热水上流冷水回流的原理会自动完成循环。…

前言技术之mybatis-plus

目录 1.什么是mybatis-plus 2.初体验 3.日志 4.主键生成策略 5.更新 6.自动填充 1.什么是mybatis-plus 升级版的mybatis&#xff0c;目的是让mybatis更易于使用&#xff0c; 用官方的话说“为简化而生” 官网&#xff1a; MyBatis-Plus 2.初体验 1.准备数据库脚本 数据…