- 浏览: 664483 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sztime:
可以在文本框上绑定事件来禁用回车键, 我就是这样做的.在IE中 ...
form 回车自动提交问题 -
damoqiongqiu:
非常好的文章,很透彻不过有一句话小僧腆着脸补充一下:“1111 ...
为什么要用补码来做存储 -
wuyizhong:
原来如此啊。
form 回车自动提交问题 -
luliangy:
谢楼主~!
用C语言扩展Python的功能 -
kwong:
很有用,谢谢
火狐和IE 对css 样式解释的差异
dynamic_cast、static_cast、const_cast 和 reinterpret_cast
一、dynamic_cast:
用法:
dynamic_cast<type-id> (expression).将expression转化为具有type-id型的指针。type-id必须是一个
指针、引用(一个已经定义的类)或者void指针。如果是个指针,expression也必须是个指针或者引用。
a. 如果type-id是expression的直接或间接基类指针,结果将是指向该expression实体的type-id类型指
针。这称作"upcast"。比如:
class B {...};
class C : public B {...};
class D : public C {...};
void f (D *pD)
{
C* pc = dynamic_cast<C*>(pD); // ok
B* pb = dynamic_cast<B*>(pD); // ok
}
b.如果type-id 是void *,那么运行时将 检查expression的实际类型。其结果是指向expression完整实
体的一个指针。
如:
class A { ... };
class B { ... };
void f()
{
A* pa = new A;
B* pb = new B;
void* pv = dynamic_cast<void*>(pa);
// pv指向A一个对象
...
pv = dynamic_cast<void*>(pb);
// pv 指向 B的一个对象
}
c.如果type-id不是void *,将在运行时检查expression对象是否可以被转型为type-id.
c-1.如果 expression是type-id的一个基类,那么将在运行时检查 expression是否指向type-id一个
完整对象。如果是,结果就是该对象的指针。否则出错
如:
class B {...};
class D : public B {...};
void f()
{
B *pB = new D;
B *pB2 = new B;
D *pD = dynamic_cast<D*> (pB); // ok.
D *pD2 = dynamic_cast<D*> (pB2) // error.
}
上面称作"downcast"
c-2.如果是多重继承.比如:
class A {...};
class B : public A {...}; // B继承自A
class C : public A {...}; // C继承自A
class D : public B, public C {...}; // D继承自B, C
此时指向D的指针可以 安全 的cast为B或者C(见上).不过如果将其cast到A该怎么办呢?
这样吗?
D *pD = new D;
A *pA = dynamic_cast <A*> (pD); //error.不知道指向哪个A.
这时我们可以先转型为B(或C),然后间接批向A。如下
B *pB = dynamic_cast <B*> (pD);
A *pA = dynamic_cast <A*> (pB); // ok
c-3.虚拟继承的情况.
class A {...} // 以后就直接简写作class name了
class B : vitual public A;
class C : public B;
class D : public B;
class E : publc C, public D;
如果E的实体或者A的子对象想要转型为 B将会是失败的(原因见上).这时你需要先转型为一个完整的E对象
,然后逐层进行明确的转型操作。
c-4.
class A;
class B : public A;
class C : public A;
class D;
class E : public B, public C, publc D;
假如E的一个对象和D子对象的一个指针,想要从D的子对象中得到A的子对象,需要三个转换。
先将D类型的指针转型为E型的一个指针,然后再逐层转型到A。
如
void f (D *pD)
{
E *pE = dynamic_cast <E*> (pD);
B *pB = dynamic_cast <B*> (pE);
// 或者 B *pB = pe;
A *pA = dynamic_cast <A*> (pB);
// or A *pA = pB;
}
c-5. (十字)交叉转换(cross cast)。
如上例中从 B (或子类) 与 D (或子类)的互相转型。
二、static_cast
关于static_cast 不想说太多。它将expression类型转型为type-id类型。可以是类(包括继承)的转型
,也可以是普通类型的转型(如int -> float). 请注意,它运行时 不做类型检查,因而可能是不安全的
。比如将 基类 转型 为 派生类指针。
三、const_cast
简单的说,其作用就是将一个类的 const、volatile以及__unaligned属性去掉。
四、reinterpret_cast
简单的说,就是任意的类型转换。但是它没有const_cast的功效。
注意, A -> B -> A,这未必是安全的。另,它将null 指针 转换为 null指针。
发表评论
-
strlcpy 的历史
2012-11-05 18:51 711strlcpy 并不属于 ANSI C,至今也还不是标准 ... -
c中的移位操作
2012-04-12 18:18 1013位移位运算符是将数据看成二进制数,对其进行向左或向 ... -
为什么要用补码来做存储
2012-04-12 18:02 2242看了些补码的知识,摘抄了些,自己整理了些。 顺便带着两个 ... -
google test 使用
2009-01-03 13:59 3554安装: 下载Google C++ Testi ... -
string 的 data() 和c_str()
2008-12-24 01:17 1258data 是字符数组,里面有 '\0 '当然也不会 ... -
C/C++ unit testing tools (18 found)
2008-12-19 01:27 1980C/C++ unit testing tools (18 f ... -
climits中的符号常量
2008-12-10 11:43 1153climits中的符号常量 符号常量 ... -
ICE初次
2008-09-02 01:48 1902按照某人的说法:跨平台的C++网络编程ICE才是王道。于是,我 ... -
对 pthread_cond_wait 的错误理解
2008-08-28 15:52 2099在线程的调度中经常会用到 pthread_cond_wait ... -
环形缓冲
2008-08-27 17:20 962/** * Copyright (c) 2008, ×××研 ... -
Linux下C语言编程的 RPC远程调用编程
2008-07-17 15:38 3424在查看libc6-dev软件包提供的工具(用 dpkg -L ... -
C++中重载操作符时什么时候定义成友元,什么时候定义为成员方法
2008-07-10 18:05 3551在C++语言中,可以用关键字operator加上运算符来表示函 ... -
c++中的存储类型
2008-07-06 00:46 1923存储类型是从变量的存 ... -
libevent 一个time server
2008-05-19 11:20 1307#include <netinet/in.h> # ... -
自己动手改写komodo sourcetree插件 对C/C++的支持
2008-04-16 22:11 1405其实很简单了, 找到sourcetree.js 的 ... -
GNU C的 __attribute__ 机制
2008-04-15 15:34 775GNU C 的一大特色(却不被初学者所知)就是 __attri ... -
module的认识和写法
2008-04-15 15:29 722不知道在什幺时候,Linux 出现了 module 这种东西, ... -
static_cast、dynamic_cast、reinterpret_cast、和const_c
2008-04-10 15:14 6244static_cast、dynamic_cast、reinte ... -
关于Linux下C/C++程序编译
2007-08-23 18:15 3688在编译之前我们需要 ... -
使用 setfill、setw 和 setprecision 基数的示例
2007-08-23 19:00 2732使用 setfill、setw 和 setprecision ...
相关推荐
本资源“例说 const_cast,reinterpret_cast,static_cast,dynamic_cast代码.rar”聚焦于四种主要的C++类型转换:const_cast、reinterpret_cast、static_cast和dynamic_cast。这四个关键字都是为了安全和高效地在...
### 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast 在C++编程语言中,为了提高程序的可读性和安全性,C++标准库提供了多种类型的转换机制。其中,最常用的四种类型转换符包括:`...
C++提供了多种类型转换的方式,包括`static_cast`、`dynamic_cast`等,每种方式都有其特定的应用场景和特点。本文将重点介绍`static_cast`与`dynamic_cast`之间的区别及其应用场景。 #### `static_cast` `static_...
标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
本文将详细介绍四种主要的显式类型转换:`static_cast`、`dynamic_cast`、`const_cast`和`reinterpret_cast`。 首先,`static_cast`主要用于非多态类型的转换,它不提供运行时的类型检查。例如,当进行基类与子类...
使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。 const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,...
1.static_cast对类的指针只能转换有继承关系的类。对普通的指针来说只能在void*和其他指针之间转换。它还可转换简单的类型,比如int到char等。不能提供数字到指针的转换。不能提供不同类型指针之间的转换比如int*到...
然而,C-style类型转换存在潜在的风险,因此,C++引入了四个新的类型转换关键字:`static_cast`、`dynamic_cast`、`reinterpret_cast`和`const_cast`,以提供更精确和安全的转换控制。下面是这些关键字的详细解释: ...
本文将详细介绍C++中的四种显式类型转换:static_cast、dynamic_cast、const_cast和reinterpret_cast。 1. static_cast static_cast是一种静态类型转换,用于非多态类型之间的转换,不提供运行时的检查来确保转换...
C++提供了多种类型转换方式,包括`static_cast`、`dynamic_cast`、`const_cast`以及`reinterpret_cast`。本文将重点探讨`dynamic_cast`的使用方法、注意事项及其与其他类型转换符的对比,旨在为读者提供全面而深入的...
C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,即const_cast、static_cast、dynamic_cast和reinterpret_cast。 const_cast是用于去掉类型的const或volatile属性的操作符。它常用于指针或引用,...
特别是在指针转换和数值转换时用到的非常多。只要编写程序的人知道自己要做什么转换,并知道应该怎样转换的话,我认为上边的转换方式非常之好。但是没有清楚的了解每个转换的细节的话,就有可能
C++ 提供了四个显式的数据类型转换函数:reinterpret_cast、const_cast、static_cast 和 dynamic_cast。这些转换函数可以在编译期间或运行期间实现数据类型的转换。 1.reinterpret_cast reinterpret_cast 是一种低...
C++提供了四种显示的强制类型转换操作符,分别是`const_cast`、`static_cast`、`dynamic_cast`和`reinterpret_cast`。 1. `const_cast`: `const_cast`主要用于移除对象的`const`或`volatile`属性,允许程序员修改...
我们探讨了C风格类型转换和C++风格类型转换的区别,并详细解释了`static_cast`、`const_cast`、`dynamic_cast`和`reinterpret_cast`这四种C++类型转换操作符的功能和用法。理解并正确使用这些类型转换操作符是提高...
C++标准定义了四种cast操作符,它们分别是C风格转换、`static_cast`、`dynamic_cast`和`const_cast`,每种都有其特定的用途和限制。以下是这四种类型转换操作符的详细说明: 1. C风格转换: C++中的C风格转换是一...
本篇文章将深入探讨C++中的四种cast操作,它们分别是:`static_cast`、`dynamic_cast`、`const_cast`和`reinterpret_cast`。这四种cast方式各自有着特定的用途,下面我们将逐一解析。 首先,`static_cast`是最常用...