C++新型强制类型转换。
C++强制类型转换分为4个不同的类型。
1、static_cast
-用作基本类型转换。
-不能用于基本类型指针转换。
-可以用于有继承关系对象之间的转换和类指针之间的转换。
#include <stdio.h> void static_cast_demo(void)
{
int i = 0x12345;
char c = 'c';
int* pi = &i; //pi -> i
char* pc = &c; //pc -> c c = static_cast<char>(i);//int i change to char c
pc = static_cast<char*>(pi);//想通过 static_cast 将int 型指针转换为 char型指针。由于static_cast不能用于基本类型指针转换error
} int main(int argc, char *argv[])
{ return ;
}
编译结果:
test.cpp: In function ‘void static_cast_demo()’:
test.cpp::: error: invalid static_cast from type ‘int*’ to type ‘char*’
2、const_cast
-用于去除变量的只读属性。
-强制内心转换的目标只能是指针或者引用
/*强制类型转换*/
#include <stdio.h> void const_cast_demo(void)
{
const int& j = ;//定义一个j引用常量,j拥有只读属性
int& k = const_cast<int&>(j);//定义一个k,通过const_cast k去除了j所拥有的只读属性 const int x = ; //定义一个常量x x拥有只读属性
int& y = const_cast<int&>(x);//定义一个y 通过const_cast y去除了引用x时所拥有的只读属性,所以y是可变的 int z = const_cast<int>(x);//想通过const_cast 来将x转换为一个int型变量,这不允许,因为const_cast 强制转换的目标只能是指针或者引用。error k = ; printf("k = %d\n", k);
printf("j = %d\n", j); y = ; printf("x = %d\n", x);
printf("y = %d\n", y);
printf("&x = %p\n", &x);
printf("&y = %p\n", &y); } int main(int argc, char *argv[])
{ const_cast_demo();
return ;
}
编译结果:
test.cpp: In function ‘void const_cast_demo()’:
test.cpp::: error: invalid use of const_cast with type ‘int’, which is not a pointer, reference, nor a pointer-to-data-member type
3、dynamic_cast
-用于指针类型之间的强制类型转换。
-用于整数和指针类型之间的强制类型转换。
#include <stdio.h> void dynamic_cast_demo()
{
int i = ;
int* pi = &i;
char* pc = dynamic_cast<char*>(pi);//dynamic_cast 只能用于整数与指针类型之间的相互转换,这里将 整数类型转换为 char*类型 error
}
int main(int argc, char *argv[])
{ return ;
}
编译结果:
test.cpp: In function ‘void dynamic_cast_demo()’:
test.cpp::: error: cannot dynamic_cast ‘pi’ (of type ‘int*’) to type ‘char*’ (target is not pointer or reference to class)
4、reinterpret_cast
-用于有继承关系的类指针之间的转换。
-用于有交叉关系的类指针之间的转换。
-具有类型检查功能。
-需要虚函数的支持。
#include <stdio.h> void reinterpret_cast_demo()
{
int i = ;
char c = 'c';
int* pi = &i;
char* pc = &c; pc = reinterpret_cast<char*>(pi);//将int* 类型指针 转换为 char*
pi = reinterpret_cast<int*>(pc);//将char* 类型指针 转换为 int*
pi = reinterpret_cast<int*>(i);//将int 类型转换为 int*类型指针
c = reinterpret_cast<char>(i); //想 通过reinterpret_cast 将int型 转换为char型 普通类型转换使用static_cast error
}
int main(int argc, char *argv[])
{ return ;
}
编译结果:
test.cpp: In function ‘void reinterpret_cast_demo()’:
test.cpp::: error: invalid cast from type ‘int’ to type ‘char’
用法格式:xxx_cast <type>(Expression)
C++新型强制类型转换。的更多相关文章
- C++ 强制类型转换详解
		
类型转换只不过是让编译器以另外一种方式解释一块内存而已.C++兼容C语言的强制类型转换方式,同时也提供了新型的基于模板的类型转换方式,来提供更多的安全性. 一.C风格的强制类型转换 double k ...
 - java中强制类型转换
		
在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
 - C++强制类型转换
		
C语言强制类型转换过于粗暴,任意类型之间都可以进行转换,编译很难判断其正确性; 难于定位,在源码中无法快速定位所有使用强制类型转换的语句. C++将强制类型转换分为4种不同的类型:static_cas ...
 - java提高篇(十一)-----强制类型转换
		
在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
 - JavaScript学习10 JS数据类型、强制类型转换和对象属性
		
JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...
 - C++强制类型转换操作符 dynamic_cast
		
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...
 - C++强制类型转换操作符 const_cast
		
const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转 ...
 - C++强制类型转换操作符 static_cast
		
static_cast是一个强制类型转换操作符.强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast.dynamic_cast.const_cast.reinterpert ...
 - Js里面的强制类型转换
		
js 和 PHP语言一样是弱类型语言.近期我也在看C语言,并没有传说中那么难,既是书中一再强调的指针部分,也没有那么夸张.至少是理论和语法理解起来不是很难.看起来凡是什么东西,不要总是被别人的话迷惑了 ...
 
随机推荐
- Jmeter(二) Jmeter组件介绍
			
一.测试计划 测试的起点,同时也是其他所有组件的容器 二.线程(用户) Setup 线程组:一种特殊类型的线程,可用于执行预测试操作.即执行测试前进行定期线程组的执行 Teardown 线程组:一种特 ...
 - 客户端框架-MVC
			
MVC Model-View-Controller MVC是比较直观的架构模式,用户操作->View(负责接收用户的输入操作)->Controller(业务逻辑处理)->Model( ...
 - git多人参与的项目 -> 分支代码如何合并到主干
			
个人理解:合并分支时候就是当前分支,与别的分支先合并一遍,然后解决分支中存在的所有冲突,之后将本地分支代码提交到git远程仓库,之后切换主干分支 ,将主干分支与分支内容合并,解决冲突, 在提交主干分支 ...
 - 自动化部署脚本--linux执行sh脚本
			
自动化部署脚本文件目录: 运行主程序:./install.sh #!/bin/bash SCRIPTPATH=$(cd "$(dirname "$0")"; p ...
 - 套接字之 getsockname && getpeername
			
getsockname-获取本地地址:比如,在绑定的时候设置端口号为0由系统自动选择端口绑定,或者使用了INADDR_ANY通配所有地址的情况下,后面需要用到具体的地址和端口,就可以用getsockn ...
 - spark 笔记 11:  SchedulingAlgorithm 两种调度算法的优先级比较
			
调度算法的最基本工作之一,就是比较两个可执行的task的优先级.spark提供的FIFO和FAIR的优先级比较在SchedulingAlgorithm这个接口体现.) { ) { ) { ) { fa ...
 - Servlet请求参数的方式
			
今天整理了以下几种常用的Servlet请求参数的方式,下面简单地介绍 1)getParameter(String key)返回一个字符串,获得name和key 一样的表单控件的数据,如果有重复的nam ...
 - 新建一个浏览器APP
			
安卓开发环境准备好了,试试新建一个浏览器程序吧 1.Start a new Android Studio Project 2.选这个像微信一样的样式 3.选择语言和版本 4.等待创建完成,拖一个Web ...
 - java里poi操作Excel工具类【我改】
			
参考原文: https://www.cnblogs.com/yizhang/p/7244917.html 我改: package test; import java.io.File; import j ...
 - 阶段3 2.Spring_03.Spring的 IOC 和 DI_7 spring中bean的细节之作用范围
			
bean的作用范围调整. 我们的bean通常情况下都是一个单例的模式 Spring是否也知道这些都是单例 构造函数只走了一次.也就是spring这个对象默认情况就是单例的 scope属性 定义bean ...