C++定义的强制转换

2011-07-21 15:17:49.0      来源:博客园         作者:佚名
关键词:  C++     强制转换  

A:转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。比如,为了转换一个类型为doubole的浮点数的指针到整型

代码

int i;

double d;

i = (int) d;

或者

i = int (d);

对于具有标准定义转换的简单类型而言工作的很好。然而,这样的转换符也能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新 的转换符:‘reinterpret_cast‘, ‘static_cast‘, ‘dynamic_cast‘ 和 ‘const_cast‘,目的在于控制类(class)之间的类型转换。

代码:

reinterpret_cast<new_type>(expression)

dynamic_cast<new_type>(expression)

static_cast<new_type>(expression)

const_cast<new_type>(expression)

1 reinterpret_cast

‘reinterpret_cast‘转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型。反之亦然。(译注:是指针具体的地址值作为整数值?)

这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。

如果情况是从一个指针到整型的拷贝,内容的解释是系统相关的,所以任何的实现都不是方便的。一个转换到足够大的整型能够包含它的指针是能够转换回有效的指针的。

代码:

class A {};

class B {};

A * a = new A;

B * b = reinterpret_cast<B *>(a);

‘reinterpret_cast‘就像传统的类型转换一样对待所有指针的类型转换。

2 static_cast

‘static_cast‘允许执行任意的隐式转换和相反转换动作。(即使它是不允许隐式的)

应用到类的指针上,意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),也能够执行相反动作:转换父类为它的子类。

在这最后例子里,被转换的父类没有被检查是否与目的类型相一致。

代码:

class Base {};

class Derived : public Base {};

Base *a = new Base;

Derived *b = static_cast<Derived *>(a);

‘static_cast‘除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换

代码:

double d = 3.14159265;

int i = static_cast<int>(d);

3 dynamic_cast

‘dynamic_cast‘只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同, 在后一种情况里(注:即隐式转换的相反过程),dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对 象。

检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL.

代码:

class Base { virtual dummy() {} };

class Derived : public Base {};

Base* b1 = new Derived;

Base* b2 = new Base;

Derived* d1 = dynamic_cast<Derived *>(b1); // succeeds

Derived* d2 = dynamic_cast<Derived *>(b2); // fails: returns ‘NULL‘

如果一个引用类型执行了类型转换并且这个转换是不可能的,一个bad_cast的异常类型被抛出

代码:

class Base { virtual dummy() {} };

class Derived : public Base { };

Base* b1 = new Derived;

Base* b2 = new Base;

Derived d1 = dynamic_cast<Derived &*>(b1); // succeeds

Derived d2 = dynamic_cast<Derived &*>(b2); // fails: exception thrown

4 const_cast

这个转换类型操纵传递对象的const属性,或者是设置或者是移除

代码:

class C {};

const C *a = new C;

C *b = const_cast<C *>(a);

其它三种操作符是不能修改一个对象的常量性的。

注意:

‘const_cast‘也能改变一个类型的volatile qualifier.

·static_cast 可以被用于强制隐型转换(例如,non-const 对象转型为const 对象,int 转型为 double,等等),它还可以用于很多这样的转换的反向转换(例如,void* 指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个 const 对象转型为 non-const 对象(只有 const_cast 能做到),它最接近于C-style的转换。

·const_cast 一般用于强制消除对象的常量性。它是唯一能做到这一点的。

C++的强制类型转换相关推荐

  1. 自动类型转换和强制类型转换

    自动类型转换: 在Java中,任何情况下,整数类型的字面值默认当成int类型处理 小容量可以自动转换成大容量,这种操作被称为自动类型转换 容量大小的定义: 容量大小不是指数据类型的字节数,而是指这个数 ...

  2. As与强制类型转换的区别以及Is运算符的使用

    前言: 开发人员经常需要将一个对象从一个类型转换成其他类型. 在c#中,类型转换按照转换方式分类分为了隐式转换和显式转换,按对象分类又分为了值类型转换和引用类型转换 CLR(参考:http://bai ...

  3. 重载new、delete和强制类型转换运算符()

    1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...

  4. C++中的向上类型转换和向下类型转换+四种强制类型转换

    转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...

  5. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

  6. 《你不知道的JavaScript》整理(六)——强制类型转换

    JavaScript中通常分为两种类型转换,"隐式强制类型转换"(implicit coercion)和"显式强制类型转换"(explicit coercion ...

  7. C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)

    十五.C++中的强制类型转换 C语言中的强制类型转换方式有两种 T i = (T)exp; T i = T(exp); 这两种方式没有差别,C++中也支持这两种方式,但是和C++中的强制类型转换运算符 ...

  8. static_cast与c风格的强制类型转换比较

    class A {int a; };class B {int b; };class C : public A {int c; };int main() {B b;C c;A* p1 = (A*) &a ...

  9. 初学python-字符串中引号的使用、input简介、强制类型转换、加减乘除简写、条件判断...

    一.字符串中单引号和双引号的使用: 1.字符串以英文单引号' '引用.eg:'Hello World' 2.若字符串中含有单引号,则以英文双引号" "引用.eg:"I'm ...

  10. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

最新文章

  1. MLIR(Multi-Level Intermediate Representation Compiler)架构 Infrastructure
  2. leetcode算法题--可被三整除的最大和
  3. VS2010下安装boost库
  4. 秘密武器 | 看AnalyticDB如何强力支撑双十一
  5. java轻功游戏,会轻功又可以飞的游戏(3d大型游戏)
  6. python文本词频统计是什么_python 大批量文本分词 以及词频统计 (高效处理案例)...
  7. '' and 'and' difference in python
  8. mysql 主从 外部连接_集群之MYsql主从服务之引伸出Mysql互为主从(环形结构)外加简单实现自己个人的负载均衡器(3)-阿里云开发者社区...
  9. Golang里的Future/Promise
  10. RubyInstallers无法下载或下载缓慢的问题
  11. Ubuntu11.04下安装QQ2011
  12. 2023届计算机保研面试基础专业问题(数据结构、算法、计算机语言、计算机网络、数据库、操作系统、数学)
  13. WIN11 TortoiseSVN 无论什么操作,都报同一个错误:请求的操作需要提升
  14. 专注网格剖分 - TetGen,NETGEN,Steller
  15. python教育学_为什么老男孩教育学Python课程更有优势?
  16. Layim 聊天功能
  17. 用认真的态度面对人生用心的思考
  18. 爬山法、随机重启爬山法、模拟退火算法对八皇后问题和八数码问题的性能测试...
  19. oracle 生成随机姓名_Oracle生成随机码
  20. 温德姆酒店集团计划今年大中华区新开超过100家酒店

热门文章

  1. 【更新链接】U盘启动制作工具(UDTOOL) v3.0.2014.0427
  2. [算法] 2-4 组合游戏
  3. 待发箱outbox空间已满
  4. android 汉字转拼音pinyin4j包
  5. poj 2373(单调队列优化dp)
  6. hdu 2473(并查集+删除操作)
  7. NYOJ 119 士兵杀敌(三)
  8. SVN的安装和启动SVN的安装
  9. 数据库设计中,多对多关系使用使用逗号分割关联讨论
  10. Python学习-基础篇4 模块与包与常用模块