四种类型转换(cast)的关键字 详解 及 代码

本文原创, 禁止转载, 如有需要, 请站内联系.

本文地址: http://blog.csdn.net/caroline_wendy/article/details/19042529

C++中常见的面试题.

题目: 关于C++中, 四种类型转换的关键字, 的详解, 也可以给出代码, 判断输出 或 判断哪些代码有误.

答案及范例如下:

四种关键字: const_cast, 常量性转除;dynamic_cast, 向下安全转型; reinterpret_cast, 重新解释转型; static_cast, 静态转型;

1.  const_cast, 常量性转除:

主要对变量的常量性(const)进行操作, 移除变量的常量性, 即可以被非常量指向和引用, 详见代码;

2. dynamic_cast, 向下安全转型:

主要应用于继承体系, 可以由 "指向派生类的基类部分的指针", 转换"指向派生类"或"指向兄弟类";

static_cast只能转换为"指向派生类";

3. reinterpret_cast, 重新解释转型:

主要是对2进制数据进行重新解释(re-interpret),不改变格式, 而static_cast会改变格式进行解释;

由派生类转换基类, 则重新解释转换, 不改变地址, 静态转换改变地址;

4. static_cast, 静态转型:

主要是数据类型的转换, 还可以用于继承;

代码如下:

/*  * cppprimer.cpp  *  *  Created on: 2014.2.10  *      Author: Spike  */  /*eclipse cdt, gcc 4.8.1*/  #include <iostream>  /*常量性移除指针详解*/  struct S {   S() : value(0) {}   int value; };  void CastConst (void) {  const S s;  std::cout << "s.value = " << s.value << std::endl;     //S* ps = &s; //error, 指向常量    S* ps = const_cast<S*>(&s);  ps->value = 1;  std::cout << "s.value = " << s.value << std::endl;     //S& rs = s; //error, 引用常量     S& rs = const_cast<S&>(s);   rs.value = 2;  std::cout << "s.value = " << s.value << std::endl; }  /*安全向下转型*/  struct B /*基类B*/ {   virtual void f() { std::cout << "Base::f" << std::endl; }     void thisf() { std::cout << "Base::thisf" << std::endl;}  virtual ~B() {} };  struct B2 /*基类B2*/ {    virtual void g() { std::cout << "Base2::g" << std::endl; }    void thisg() { std::cout << "Base2::thisg" << std::endl;}     virtual ~B2() {} };  struct D : public B, public B2 /*派生类D*/ {  virtual void f() { std::cout << "Derived::f" << std::endl; }  virtual void g() { std::cout << "Derived::g" << std::endl; }  virtual ~D() {} };  void CastDynamic (void) {    B* pB_D = new D;   pB_D->f();   //pD->g(); //error, 只包含B部分       D *pD_D = dynamic_cast<D*>(pB_D); //转换为派生类   pD_D->g();   B2* pB2_D = dynamic_cast<B2*>(pB_D); //转换为兄弟类    pB2_D->g();      D *pD_Ds = static_cast<D*>(pB_D);    pD_Ds->g();      //B2* pB2_Ds = static_cast<B2*>(pB_D); //error, 不能转换为兄弟类 }  /*重新解释转型*/  struct rA { int m_a; }; struct rB { int m_b; }; struct rC : public rA, public rB {};  void CastReinterpret (void) {     int *i= new int;   *i = 10;   std::cout << "*i = " << *i << std::endl;   std::cout << "i = " << i << std::endl;     double *d=reinterpret_cast<double*> (i);     std::cout << "*d = " << *d << std::endl;   std::cout << "d = " << d << std::endl;     rC c;   std::cout << "&c = " << &c << std::endl            << "reinterpret_cast<rB*>(&c) = " <<reinterpret_cast<rB*>(&c) << std::endl             << "static_cast <rB*>(&c) = " << static_cast <rB*>(&c) << std::endl            << "reinterpret_cast<rA*>(&c) = " <<reinterpret_cast<rA*>(&c) << std::endl             << "static_cast <rA*>(&c) = " << static_cast <rA*>(&c) << std::endl            << std::endl; }  int main (void) {    std::cout << std::endl << "常量性转除:" << std::endl;    CastConst();    std::cout << std::endl << "安全向下转型:" << std::endl;   CastDynamic();  std::cout << std::endl << "重新解释转型:" << std::endl;   CastReinterpret(); } 

输出:

常量性转除: s.value = 0 s.value = 1 s.value = 2  安全向下转型: Derived::f Derived::g Derived::g Derived::g  重新解释转型: *i = 10 i = 0x471718 *d = 2.55917e-307 d = 0x471718 &c = 0x22feb0 reinterpret_cast<rB*>(&c) = 0x22feb0 static_cast <rB*>(&c) = 0x22feb4 reinterpret_cast<rA*>(&c) = 0x22feb0 static_cast <rA*>(&c) = 0x22feb0 

转载于:https://blog.51cto.com/spikeking/1387941

C++/面试 - 四种类型转换(cast)的关键字 详解 及 代码相关推荐

  1. 安卓判断服务器返回的状态码,关于服务器返回的十四种常见HTTP状态码详解

    原标题:关于服务器返回的十四种常见HTTP状态码详解 HTTP状态码 状态码是由3位数字和原因短语组成的(比如最常见的:200 OK),其中第一位数字表示响应类别,响应类别从1到5分为五种 add:其 ...

  2. Day16-01 P71 面向对象12什么是多态 P72 对象13:instanceof和类型转换 P73 static关键字详解 P74 抽象类 P75 接口的定义与实现 P76N种内部类

    Day16-01 P71 面向对象12:什么是多态 //父类Person package com.oop.demo06;public class Person {public void run(){S ...

  3. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)–发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先了 ...

  4. Mysql有四种事务隔离级别,详解脏读、不可重复读、幻读

    Mysql的事务隔离级别 Mysql有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读.不可重复读.幻读的问题. 脏读 大家看一下,我们有两个事务,一个是 Transact ...

  5. 遍历Map的四种方法之map.entry详解

    Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项(里面有Key和Va ...

  6. java中创建线程的四种方式及线程池详解

    众所周知,我们在创建线程时有四种方法可以用,分别是: 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 4.使用线程池创建(使用ja ...

  7. 四种类型转换 cast

    1.static_cast 2.dynamic_cast 3.const_cast 4. reinterpret_cast 例子1: float x; cout<<static_cast& ...

  8. [ 网络协议篇 ] IGP 详解之 OSPF 详解(二)--- 四种网络类型 虚链路 详解

  9. 服务器返回响应http短语,关于服务器返回的十四种常见HTTP状态码详解

    2XX 成功 200 OK 表示请求被服务器正常处理 最常见的就是这个了,随着这个状态码返回的信息跟你的请求方法有关,比如GET请求,请求的资源会作为响应实体返回,而HEAD请求,信息只存在于响应报文 ...

最新文章

  1. X@X.X域名转向的实现
  2. pytorch神经网络插件或可以提高所有网络的准确率(提高权重的利用率)
  3. java crontab_(定时任务)crontab和cron 的用法
  4. 几种作图软件使用感言
  5. SpringBoot从介绍到各个框架的整合
  6. 处理上百万条的数据库如何提高处理查询速度
  7. 如何优化 .NET Core 中的 lambda 查询表达式 ?
  8. python json 不好用_Python之json使用
  9. 利用PUT方式上传文件的方法研究
  10. WPF TextBox 正则验证 大于等于0 小于等于1 的两位小数
  11. linux系统生成的新文件是什么编码的,Linux系统的默认编码怎样设置?
  12. SVN工作笔记004---svn查看log提示_offline
  13. docker pull 私有_Docker系列教程03Docker私有仓库搭建(registry)
  14. [微软官网] SQLSERVER 执行页面还原
  15. 考完试写一套新闻系统
  16. linux 生成bmp,linux下生成bmp图片的测试程序
  17. 零基础学python电子书-零基础学Python(全彩版)
  18. python:base64与图片的互转
  19. inno setup 卸载注册表_Inno Setup Compiler卸载时删除注册表
  20. 爱情不是等你有空才珍惜的

热门文章

  1. C++面试题,平时面试不可缺少的!
  2. 第二单元总结——多线程设计
  3. Eclipse 中部署应用到任意服务器
  4. 移动端手势库设计与实践
  5. 思维导图中的快捷键分享
  6. 《Adobe Photoshop CS6中文版经典教程(彩色版)》—第1课1.4节在Photoshop中还原操作...
  7. 王彪20162321 2016-2017-2 《程序设计与数据结构》第6周学习总结
  8. 解决IP地址冲突的问题
  9. 【数字全排列】LeetCode 47. Permutations II
  10. Win10系统 如何查看win10版本类型及版本号