static_cast dynamic_cast const_cast reinterpret_cast

1. static_cast
  
  
  
  

用法:static_cast<type-id>(expression)

该运算符将expression表达式转化为type-id类型,但没有运行时类型检查来保证转换的安全性。主要有如下几种用法:

a. 用于类层次结构中基类和父类指针或引用之间的转换

进行上行转换(将子类指针或引用转化为父类)是安全的

而进行下行转换时,由于缺乏运行时检查机制,因而是不安全的

b. 基本数据类型之间的转换。安全性由开发人员保证

c. 将空指针转化为目标类型的空指针

d. 将任何类型的表达式转化为void类型

static_cast不能转换掉expression的const、volatile、_unaligned属性

2. dynamic_cast
  
  
  
  
用法:dynamic_cast<type-id>(expression)
将expression转换成type-id类型的对象,type-id必须是类的指针、引用或void*
dynamic_cast可以在执行期决定真正的类型,如果下行转换是安全的,则传回适当的类型,如果不安全则传回NULL
dynamic_cast主要用于类层次间的上行、下行转换,还可以用于交叉转换
进行上行转换时和static_cast是一样的
而进行下行转换时,由于dynamic运行时类型检查,因而比static_cast安全
//交叉转换
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 = 100;
	//D *pd1 = static_cast<D *>(pb); //compile error,static_cast不能进行交叉转换
	D *pd2 = dynamic_cast<D *>(pb);  //可以转换,但结果为NULL
	delete pb;
}


3. const_cast
  
  
  
  
用法:const_cast<type_id> (expression)
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression_r_r的类型是一样的。主要用法如下:
a. 常量指针被转化成非常量指针,并且仍然指向原来的对象
b. 常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
//codeblock测试
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    //此处const对象应被用volatile修饰,否则代码被编译器优化后
    //第二次对a求值时,CPU不回去访问内存,而是去查看a的备份,
    //从而第二次打印结果错误为10
    //const int a = 10;
    volatile const int a = 10;

    int * p = const_cast<int*>(&a);
    cout<<a<<"   "<<*p<<endl;

    *p = 20;

    cout<<a<<"   "<<*p<<endl;


    return 0;
}


4. reinterpret_cast
用法:reinpreter_cast<type-id> (expression_r_r) type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。 该运算符的用法比较多。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

你可能感兴趣的:(static_cast dynamic_cast const_cast reinterpret_cast)