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语言,并没有传说中那么难,既是书中一再强调的指针部分,也没有那么夸张.至少是理论和语法理解起来不是很难.看起来凡是什么东西,不要总是被别人的话迷惑了 ...
随机推荐
- unittest详解(七) 自动生成测试报告
用例执行完成后,执行结果默认是输出在屏幕上,其实我们可以把结果输出到一个文件中,形成测试报告. unittest自带的测试报告是文本形式的,如下代码: import unittest if __nam ...
- vue中使用iconfont和在旧有的iconfont中添加新的图标
todo 使用参考:https://blog.csdn.net/qq_34802010/article/details/81451278 大体步骤是正确的,具体可参考官方文档和下载下来的代码中的dem ...
- Filter、Listener、Interceptor、Controller in a Request
从以下程序运行Log 可以看出在一个Request 执行过程中 MyListener>>requestInitialized >>> MyFilter>> ...
- UNITY相关的一些新功能,新想法
1,lua profiler for unity : https://github.com/ElPsyCongree/LuaProfiler-For-Unity 参考文章:https://blog.c ...
- RF问题收集
console中不打印日志 报错信息: 修改pop方法: try: result = result.decode('UTF-8') except UnicodeDecodeError: pass re ...
- 全面解读php-引用变量(&)
本文讲述引用传值的核心原理,看完即可扫清一切和引用传值相关的内容,不会了记得画图. 一.memory_get_usage的使用 传值赋值 // 定义一个变量 $a = range(0, 10000); ...
- 引用&指针交换函数实践
实践如下: #include <iostream> using namespace std; // 普通交换,注意这里的ab值,在具体调用时是基本数据的拷贝,原始数据不会变化 // 因此这 ...
- PDFCrop裁剪PDF文档使用方法
使用VISIO画图,然后生成PDF文档插入到LaTeX文档中,会出现黑边框的问题.通过对PDF文件进行裁剪可以去掉黑边框,之前我是通过Acrobat进行裁剪,后来激活失效了..只好找其他方法.今天发现 ...
- 可以展开和收起的的LinearLayout
package com.loaderman.expandablelinearlayout; import android.animation.ObjectAnimator; import androi ...
- web.py下获取get参数
比较简单,就直接上代码了: import web urls = ( '/', 'hello' ) app = web.application(urls, globals()) class hello: ...