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

时间: 2024-10-12 04:20:58

c++中的强制转换的相关文章

c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿

c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用.其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用:在方法中定义一个static变量,该变量在程序开始存在直到程序结束:类中定义一个static成员,该成员随类

Php中的强制转换详解

强制转换中分为两种,第一种就只临时转换,和永久转换.在临时转换中呢,首先可以通过第一中方式来显示,就是小括号的形式,临时转换成整型我们可以通过(int)都是这样的形式,或者是(integer)临时转换成整型,再往下再来看,临时转成浮点类型可以通过(float)或者是(double)或者是(rea!)临时转换成浮点类型,第三个临时转换成布尔类型,可以通过(boolean)或者你可以试验一下(bool)缩写的形式,我们可以来尝试写上一个布尔类型,再往下呢还可以转换成字符串型.字符串型可以通过(str

js中+号强制转换小例子

1 <script> 2 console.log(([]+{}).length); 3 </script> 4 </head> 输出竟然是: 为什么会是15呢? 因为在+号的强制转换成字符串下{} 这个对象,实际是"{Object object}" 加上两个object中间的空格和“[“ ”]”这两个大括号12个字母的两个object,所以就有15个字符出现了. 我们换成下面的代码输出: 1 <script> 2 console.log(

参数强制转换还是将参数的地址强制转换成线程参数

第一种方式:将传递的值,强制转换值的地址,然后在线程函数中,首先强制转换参数的类型,然后取值 DWORD WINAPI ThreadProc(LPVOID lpParam){ int i=(*(int*)lpParam);   //get the parameter from CreateThread function CreateThread(NULL,            NULL,      ThreadProc,      (LPVOID)i,**********      0,   

JAVA 类型转换:隐式转换与强制转换

  这篇随笔是对java类型转换的回顾,方便忘记的时候查询,同时希望帮助有这方面需要的朋友 一. 数据类型分类: 简单数据类型:整型.实型.字符型((byte-short-char)-int-long-float-double) 二.简单类型转换 (1)低级向高级转换---自动转换:隐式转换 byte i = 0;        int a =i;        long b = i;        float c =b;        double d =c;        short j =

OC中的类型强制转换

在Objective-C中,以数字格式组成的字符串经常需要转换为NSNumber对象后再使用.例如有一个字符串对象@"111.22",需要转为NSNumber对象,最简单的方法就是这样:[NSNumber numberWithFloat:[@"111.22" floatValue]]. 这个方法先使用NSString的floatValue方法将字符串转成float,再使用NSNumber的numberWithFloat方法将结果转成NSNumber.但它有一个前提条

C#中的强制类型转换与as转换的区别

C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果使用强制转换 1 ClassB c = (ClassB)a; 会报InvalidCastException异常 无法将类型为ClassA的对象强制转换为类型ClassB 若使用as关键字进行转换则 1 2 3 4 5 ClassB c=a as ClassB;  if(c!=null)  {  Me

总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)

做个笔记:源自论坛:http://bbs.csdn.net/topics/210039564 总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast) C 风格(C-style)强制转型如下: (T) expression // cast expression to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(expression) // cast express

Map集合中key不存在时使用toString()方法、valueOf()方法和强制转换((String))之间的区别

1.toString()方法 底层代码 public String toString() { return this; } 其返回值为String类型的字符串本身 1 Map<String, Object> params = new HashMap<String, Object>(); 2 //Map集合中没有key为1的键值对 3 String result = params.get("1").toString(); 4 if (result == null)