类型转换只不过是让编译器以另外一种方式解释一块内存而已。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++ 强制类型转换详解的更多相关文章

  1. C++四种强制类型转换详解

    什么是类型转换? 类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式.为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符. C与C++的类型转换 //C中: //复 ...

  2. Java类型转换详解

    Java类型转换详解 最近有同学问:自动类型转换老是记不住,到底是大转小,还是小转大 其实这个不用死记硬背,很好理解,我们拿 int 和 short 来举例: int 是 4 字节,也就是 32 bi ...

  3. java类型转换详解(自动转换和强制转换)

    自动转换 class Hello { public static void main(String[] args) { //自动转换 int a = 5; byte b = 6; int c = a ...

  4. javascript强制转换详解

    转换成数值 Number函数强制转换成数值 数值->转换成原来的值 字符串->如果可以解析为数值,则转换成数值:否则转换成NaN或者0 true->1,falSe->0 und ...

  5. php对字符串的操作3之 字符类型转换详解

    所有的数据输出到屏幕上,实际上被隐式的转换成了字符型,首先了解下各种数据类型的字符串表示 <?php echo 300,'<hr>'; echo true,'<hr>'; ...

  6. Php中的强制转换详解

    强制转换中分为两种,第一种就只临时转换,和永久转换.在临时转换中呢,首先可以通过第一中方式来显示,就是小括号的形式,临时转换成整型我们可以通过(int)都是这样的形式,或者是(integer)临时转换 ...

  7. 关于Struts2的类型转换详解

    详细出处参考:http://www.jb51.net/article/35465.htm 一.类型转换的意义 对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构 ...

  8. 【转】C语言中不同的结构体类型的指针间的强制转换详解

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

  9. C-printf/sprintf/snprintf中的类型转换详解

    源码1 #include <stdio.h> void f1() { double x = -5.5625; printf("%d\n",x); //输出为0,为什么? ...

随机推荐

  1. TVP访谈 | 贝壳金服史海峰:中台虽百家争鸣,但不是所有企业必需品

    导语 | 中台作为一个技术概念,曾一度被捧得火热.那么,中台现在发展到了什么阶段呢?对于所有企业来讲,中台都是普适的么?中台在具体的落地过程中,究竟存在哪些问题呢?腾讯云最具价值专家(TVP)史海峰, ...

  2. SpringBoot中SpringMVC的自动配置以及扩展

    一.问题引入 我们在SSM中使用SpringMVC的时候,需要由我们自己写SpringMVC的配置文件,需要用到什么就要自己配什么,配置起来也特别的麻烦.我们使用SpringBoot的时候没有进行配置 ...

  3. Mysql备份与恢复(2)---逻辑备份

    数据库及时备份可以帮助我们在数据库出现异常宕机时及时的使用备份数据进行恢复工作,将因为数据库宕机产生的影响降低到最小.上一篇针对使用xtrabackup工具进行物理备份和数据恢复做了一个详细讲解,本篇 ...

  4. Linux中du、df显示不一致问题

    Linux中du.df显示不一致问题 最近在做关于Q博士的项目的时候,用到了docker进行部署,对于后端服务可能会经常变动,于是将docker容器的jar包与宿主机目录下的jar包进行绑定,之后每次 ...

  5. phpcms2008安装时mysql出错

  6. ASCII、UNICODE、UTF

    在计算机中,一个字节对应8位,每位可以用0或1表示,因此一个字节可以表示256种情况. ascii 美国人用了一个字节中的后7位来表达他们常用的字符,最高位一直是0,这便是ascii码. 因此asci ...

  7. JavaSelenium 页面常用基本操作语法

    元素定位                 findElement() 方法返回一个元素, 如果没有找到,会抛出一个异常 NoElementFindException()              fi ...

  8. 【转】Hibernate面试问题集锦: 概述

    ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.怎么配置Hibernate? A.Configuration类使用配 ...

  9. 【转】提升你的Java应用性能:改善数据处理

    提升你的Java应用性能:改善数据处理 作者:贾小骏  发布于07月26日 10:17 许多应用程序在压力测试阶段或在生产环境中都会遇到性能问题.如果我们看一下性能问题背后的原因,会发现很多是由数据处 ...

  10. ArcEngine语法笔记(VB)

    1.获取图层字段 Dim pTable As ITable = pLayer Dim pField As IField pField = pTable.Fields.Field(i) Next  2. ...