c++中的强制转换
一、C语言的强制转换
1.1 隐性转换
不同数据类型之间赋值和运算,函数调用传递参数等等,由编译器完成
int nTmp = 10;
short sTmp = nTmp; //这个时候就需要注意转换时数据是否溢出(大字节转小字节)
1.2 显性转换
在变量的前面加上(Type)进行显性转换,如:
class Test;
Test *test;
T* obj = (T*)test;//将对象强制转换成T
二、C++语言的转换
C++语言的强制有由四个标准的转换符组成;static_cast、const_cast、dynamic_cast、reinterpret_cast,除前面四个转
换符,C++也继承了C语言的强制转换,但这种转换并不是安全和严格的。
2.1 static_cast
用法:static_cast < typeid > ( exdivssion )
该运算符把exdivssion转换为typeid类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类和子类之间指针或引用的转换。
进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉exdivssion的const、volitale、或者__unaligned属性。
2.2dynamic_cast
用法:dynamic_cast < typeid > ( exdivssion )
该运算符把exdivssion转换成typeid类型的对象。Type-id必须是类的指针、类的引用或者void *;
①如果type-id是类指针类型,那么exdivssion也必须是一个指针,如果type-id是一个引用,那么exdivssion也
必须是一个引用。
②dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
③在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全
class CBase
{
public:
virtual void PrintfOut(){};
};
class Test : public CBase
{
private:
int m_nCount;
};
void func(CBase *pb)
{
Test *pd1 = static_cast(pb);
Test *pd2 = dynamic_cast(pb);
}
注意:通常情况下dynamic_cast,在基类转为了类才有意义,但是如果没有虚函数,基类转换为子类时会出错,
这是虚函数对dynamic_cast,说句题外话虚函数表,在C++对象模型中,对象实例最前面的就是虚函数表指针。
2.3 reindivter_cast
用法:reindivter_cast<typeid>(exdivssion)
type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。
它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,
在把该整数转换成原类型的指针,还可以得到原先的指针值)。
2.4 const_cast
用法:const_cast<typeid>(exdivssion)
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, typeid和exdivssion的类型是一样的。
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
const int tmpValue = 10;
const int* nConst = &tmpValue;
int* modify = c
c++中的强制转换的更多相关文章
- c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿
c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast ...
- Php中的强制转换详解
强制转换中分为两种,第一种就只临时转换,和永久转换.在临时转换中呢,首先可以通过第一中方式来显示,就是小括号的形式,临时转换成整型我们可以通过(int)都是这样的形式,或者是(integer)临时转换 ...
- C++中类型强制转换
C++中强制类型转换有四种: 1.static_cast 格式:static_cast<Type>(Value); --用于基本类型间的转换,但不能用于基本类型指针间的转换: int i ...
- 关于 C++ 中的强制转换 - 基础篇
引言 假设有基类 A,包含了虚函数 func1,以及有派生类 B,继承于类 A,派生类 B 中实现了函数 func1.此时可以用 A 类型的指针指向 B 类型的对象,并用 A 类型的指针调用 B 类型 ...
- java 中的强制转换
强制转换分两种,一种是基础类型强制转换(Type Conversion),一种是引用类型强制转换(Class Casting):
- js中+号强制转换小例子
1 <script> console.log(([]+{}).length); </script> </head> 输出竟然是: 为什么会是15呢? 因为在+号的强 ...
- Java中的强制转换
特点: 1.需要程序员手动修改代码 2.语法:范围小的类型 变量名 = (范围小的类型)范围大的类型的数据 3.从范围小 到 范围大 注意: 强制类型转换可能会造成数据的丢失哦,小伙伴们在应用时一定 ...
- ARX中类型强制转换
比如 克隆 clone, 获得的是一个acrxobject, acrxobject *pobj=pployline->clone(); acdbpolyline *ppoly=acdbpolyl ...
- [Effective JavaScript 笔记]第59条:避免过度的强制转换
js是弱类型语言.许多标准的操作符和代码库会把输入参数强制转换为期望的类型而不是抛出错误.如果未提供额外的逻辑,使用内置操作符的程序会继承这样的强制转换行为. functin square(x){ r ...
随机推荐
- POJ_2115_扩展欧几里德
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23673 Accepted: 6540 Descr ...
- 【剑指Offer】31、从1到n整数中1出现的次数
题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他 ...
- swift-教你如何实现导航上的UISearchController动画效果。
这个代码片段是我这周我从网上找了各种资料然后经过自己的修改终于弄好了导航的上下动画效果: step1:==>因为这个搜索要有动画效果,所以这个页面必须要有一个导航控制器: //1.自定义创建导航 ...
- keycode键盘 按键 - 键码 对应表
字母和数字键的键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 3 ...
- jQuery动态效果
1.一号店首页 2.淘宝网购物车
- js对对象的校验技巧,随时更新
js中,字符串长度用length. 若不确定一个Map里,是否存在某个对象,则用underfind 去校验
- Firefox配置Fiddler
Fiddler: Toos->Telerik Fiddler Options->HTTPS->Capture HTTPS CONNECTs Toos->Telerik Fidd ...
- 使用厂商MIB库查找设备OID值并实施监控的方法
https://wenku.baidu.com/view/8f4b389e0029bd64783e2cd0.html
- 框架统一出参数DTO格式
这个可以没必要定义. 每个接口返回自己的数据格式就好
- 非form表单提交的数据就要用@requestbody注解获取http传过来的值,尤其json
非form表单提交的数据就要用@requestbody注解获取http传过来的值,尤其json