C++ 强制类型转换详解
类型转换只不过是让编译器以另外一种方式解释一块内存而已。C++兼容C语言的强制类型转换方式,同时也提供了新型的基于模板的类型转换方式,来提供更多的安全性。
一、C风格的强制类型转换
double k = (double)(5 / 3);
这种类型转换是不执行任何检查的,这意味着以下类型转换同样能够通过编译:
struct A
{
int a;
double b;
};
int main(int argc, char *argv)
{
const char *msg = "Hello";
A *obj = (A *)msg; // 通过编译,但是不合法。
return 0;
}
这样obj
对象是不合法的。因此,C++代码最好不要采取这种做法。
二、C++类型转换:static_cast
static_cast
转换主要用于以下情况:
- 相关基本数据类型之间的类型转换
- 子类转换为父类类型
- 将
void*指针
转换为其它类型指针 - 同数据类型的引用类型的类型转换
class Base {};
class Derive : public Base {};
int main(int argc, char *argv[])
{
// 一:相关基本数据类型之间的类型转换
int a = static_cast<int>(4.2);
// 二:子类转换为父类类型
Base base = static_cast<Base>(Derive());
// 三:将void*转换为其它类型指针
void *p = &a;
int *pa = static_cast<int*>(p);
// 四:同数据类型的引用类型的类型转换
int &aref = static_cast<int&>(a);
int &&arref = static_cast<int&&>(a);
return 0;
}
三、C++类型转换:dynamic_cast
dynamic_cast
用于将父类指针(或引用)向子类指针(或引用)的类型转换。
注意:为了使用dynamic_cast
,类中必须包含虚函数。
class Base {};
class Derive : public Base {};
int main(int argc, char *argv[])
{
Base *b = new Derive();
Derive *d = dynamic_cast<Derive*>(b);
return 0;
}
四、C++类型转换:const_cast
const_cast
用于除去指针或者引用的const
属性:
int main(int argc, char *argv[])
{
const int a = 0;
const int *const p = &a;
int *pa = const_cast<int*>(p);
*pa = 10; // a = 0, *pa = 10
return 0;
}
由于const
限定符,a
的值不会被改变,详见:C++ const详解。
五、C++类型转换:reinterpret_cast
reinterpret_cast
处理无关数据类型之间的转换。
struct A
{
int a;
double b;
};
int main(int argc, char *argv)
{
A a = {0, 0};
A *pa = &a;
char *c = reinterpret_cast<char*>(pa);
return 0;
}
C++ 强制类型转换详解的更多相关文章
- C++四种强制类型转换详解
什么是类型转换? 类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式.为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符. C与C++的类型转换 //C中: //复 ...
- Java类型转换详解
Java类型转换详解 最近有同学问:自动类型转换老是记不住,到底是大转小,还是小转大 其实这个不用死记硬背,很好理解,我们拿 int 和 short 来举例: int 是 4 字节,也就是 32 bi ...
- java类型转换详解(自动转换和强制转换)
自动转换 class Hello { public static void main(String[] args) { //自动转换 int a = 5; byte b = 6; int c = a ...
- javascript强制转换详解
转换成数值 Number函数强制转换成数值 数值->转换成原来的值 字符串->如果可以解析为数值,则转换成数值:否则转换成NaN或者0 true->1,falSe->0 und ...
- php对字符串的操作3之 字符类型转换详解
所有的数据输出到屏幕上,实际上被隐式的转换成了字符型,首先了解下各种数据类型的字符串表示 <?php echo 300,'<hr>'; echo true,'<hr>'; ...
- Php中的强制转换详解
强制转换中分为两种,第一种就只临时转换,和永久转换.在临时转换中呢,首先可以通过第一中方式来显示,就是小括号的形式,临时转换成整型我们可以通过(int)都是这样的形式,或者是(integer)临时转换 ...
- 关于Struts2的类型转换详解
详细出处参考:http://www.jb51.net/article/35465.htm 一.类型转换的意义 对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构 ...
- 【转】C语言中不同的结构体类型的指针间的强制转换详解
C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...
- C-printf/sprintf/snprintf中的类型转换详解
源码1 #include <stdio.h> void f1() { double x = -5.5625; printf("%d\n",x); //输出为0,为什么? ...
随机推荐
- final阶段20191121-5 Scrum立会报告+燃尽图 01
此作业要求参见:http://edu.cnblogs.com/campus/nenu/2019fall/homework/10065 一: 组名:组长组 组长:杨天宇 组员:魏新 罗杨美慧 王歆 ...
- 从零开始のcocos2dx生活(十一)TableView
目录 简述 主要变量 主要方法 setVerticalFillOrder reloadData cellAtIndex updateCellAtIndex insertCellAtIndex remo ...
- $Luogu4403$ 秦腾与教学评估 二分
$Luogu$ $Description$ 有$N$个数列,求一个$x$,$x$在各个数列中的出现次数之和为奇数.这样的$x$最多存在$1$个.若不存在则输出Poor QIN Teng:( $Sol$ ...
- my_mysql
###一键偷懒YUM安装MySQbL### 1.安装mysql数据库 #yum install -y mariadb-server mariadb 2.登录mysql数据库常用选项 -h:指定服务端 ...
- Linux-Cacti监控{Verson:1.2.8}
首先需要一个LAMP平台 或LNMP平台 yum -y install httpd mariadb php mariadb-server mariadb-devel zlib freetype lib ...
- 物理ceph集群+K8s
前提条件 在Ceph为k8s创建一个pool ceph osd pool create k8s 128 创建admin用户 ceph auth get-or-create client.admin m ...
- 前端面试基础回顾之深入JS继承
前言 对于灵活的js而言,继承相比于java等语言,继承实现方式可谓百花齐放.方式的多样就意味着知识点繁多,当然也是面试时绕不开的点.撇开ES6 class不谈,传统的继承方式你知道几种?每种实现原理 ...
- Win10下设置默认输入法与默认中文输入
实现的效果: 把自己需要的一个或多个输入法软件添加到输入法列表中(一般就指定一个),避免了需要在打字时Ctrl + Shift等快捷键在多个输入法中不停切换的麻烦 首选语言默认为中文,毕竟作为一个中国 ...
- 基于Arduino的红外遥控
1.红外接收头介绍 一.什么是红外接收头? 红外遥控器发出的信号是一连串的二进制脉冲码.为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管 ...
- 动态内存分配(C++)
C++中的动态内存分配 C++中通过new关键字进行动态内存分配 C++中的动态内存申请是基于类型进行的 delet关键字用于内存释放 //变量申请 Type*pointer = new Type; ...