c++ --> c++中四种类型转换方式
用法:static_cast < type-id > ( exdivssion )
用法:dynamic_cast < type-id > ( exdivssion )
class B{
public:
int m_iNum;
virtual void foo();
};
class D:public B{
public:
char *m_szName[];
};
void func(B *pb){
D *pd1 = static_cast(pb);
D *pd2 = dynamic_cast(pb);
}
class A{
public:
int m_iNum;
virtual void f(){}
};
class B:public A{
};
class D:public A{
};
void foo(){
B *pb = new B;
pb->m_iNum = ;
D *pd1 = static_cast(pb); //compile error
D *pd2 = dynamic_cast(pb); //pd2 is NULL
delete pb;
}
用法:reinterpret_cast < type-id > ( exdivssion )
int i;
char *p = "This is a example.";
i = reinterpret_cast<int>(p);
此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,一个明显的现象是在转换前后没有数位损失。
用法:const_cast < type-id > ( exdivssion )
class B{
public:
int m_iNum;
}
void foo(){
const B b1;
b1.m_iNum = ; //comile error
B b2 = const_cast(b1);
b2. m_iNum = ; //fine
}
六、dynamic_cast举例
1)如果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
}
2)如果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的一个对象
}
3)如果type-id不是void *,将在运行时检查expression对象是否可以被转型为type-id。
a. 如果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"
b. 如果是多重继承,比如:
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. 虚拟继承的情况
class A {...} // 以后就直接简写作class name了
class B : vitual public A;
class C : public B;
class D : public B;
class E : publc C, public D;
class A;
class B : public A;
class C : public A;
class D;
class E : public B, public C, publc D;
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;
}
e. (十字)交叉转换(cross cast)。如上例中从B(或子类)与D(或子类)的互相转型。
c++ --> c++中四种类型转换方式的更多相关文章
- C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)
Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而 ...
- C++中四种类型转换方式
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...
- 【转】C++四种类型转换方式
C++四种类型转换方式 https://blog.csdn.net/lv_amelia/article/details/79483579 C风格的强制类型转换(Type Case)很简单,不管什么类型 ...
- 【C++】类型转换简述:四种类型转换方式的说明及应用
本文主要简述在C++中四种类型转换的方式:static_cast.reniterpret_cast.const_cast和dynamic_cast. 在介绍C++类型转换方式之前,我们先来看看C语言的 ...
- [转]C++中四种类型转换符的总结
C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression) reinterpret_cast操 ...
- C++中四种类型转换以及const_cast是否能改变常量的问题
we have four specific casting operators:dynamic_cast, reinterpret_cast, static_cast and const_cast. ...
- Web.xml中四种验证方式
源地址:https://blog.csdn.net/imimi_/article/details/78805642 <security-constraint> 的子元素 <http- ...
- C++四种类型转换方式。
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...
- OC中四种遍历方式
标准的C语言for循环.Objective-C 1.0出现的NSEnumerator.Objective-C 1.0出现的for in快速遍历.块遍历. 遍历的话,一般是NSArray.NSDicti ...
随机推荐
- 2.3 PCI桥与PCI设备的配置空间
PCI设备都有独立的配置空间,HOST主桥通过配置读写总线事务访问这段空间.PCI总线规定了三种类型的PCI配置空间,分别是PCI Agent设备使用的配置空间,PCI桥使用的配置空间和Cardbus ...
- 一句Python,一句R︱数据的合并、分组、排序、翻转
先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. python中的numpy模块相当于R中的matirx矩 ...
- yii学习笔记--使用gii快速创建控制器和模型
配置gii 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'123456',//使用gii的密码 // If ...
- JAVA之编码---->CSV在文本下是正常的,用EXCEL打开是乱码的问题
JAVA之编码---->CSV在文本下是正常的,用EXCEL打开是乱码的问题 在JAVA下输出文件流,保存成CSV(用UTF-8)文件,怎么处理用EXCEL下是乱码,但是在记事本等其他软件都是正 ...
- 【原】Java学习笔记029 - 映射
package cn.temptation; import java.util.HashMap; import java.util.Map; public class Sample01 { publi ...
- python学习之字典(Dictionary)练习
Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型 字典中分为键值对 , key 类型需要时被哈希. value 类型可以是 字符串.数字.元组等其他容器模 ...
- 对spring web启动时IOC源码研究(二)
发现这样debug到哪说到哪好像有点回不来了~让我重新理下思路,主要步骤先上图,有什么不同意见欢迎批评教育~ (一)spring IOC的主要步骤都在refresh()这个方法中,我给出了自己的理解注 ...
- 认识大前端html+css+js
认识大前端:前端就是将效果图生成网页,利用html+css+js等技术. 如果把前端比作一台汽车,那么html就是车的骨架,css就是完整的车的模型,而js就充当着车的发动机... 建议: 刚刚开 ...
- Java8 日期/时间(Date Time)使用简介
特别说明: LocalDateTime 为日期时间的计算提供了很大的方便, 在构造对象/运算/toString等方便都非常便利. 3个常用的类: java.time.LocalDateTime; ja ...
- Keras官方中文文档:函数式模型API
\ 函数式模型接口 为什么叫"函数式模型",请查看"Keras新手指南"的相关部分 Keras的函数式模型为Model,即广义的拥有输入和输出的模型,我们使用M ...