关于c++ 强制转换类型运算符 static_cast、dynamic_cast、reinterpret_和const_cast

因为虽然很多有经验的C++程序员认为他们知道,但是他们还是不知道全部。(我也没有知道全部 )

1.const_cast。
你知道,一个int*是可以直接赋给一个const int*的,但是一个const int*是不可以直接赋给一个int*的。这就需要:
int* pi=const_cast<int*>pci;

EG:

const A *pa = new A;//const对象   
A *pb;//非const对象   
//pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象   
pb = const_cast<A*>(pa);// 现在OK了 


他还可以把volatile和对齐特性(alignment)去掉。
2.reinterpret_cast
就是:把整型(广义的)转换为指针,把指针转换为整型(广义的),把指针转换为另一个类型的指针。

A* pa = new A;   
void* pv = reinterpret_cast<A*>(pa);  
3.static_cast
可以做任何显式的自动转换(implicit cast),也可以做那些自动转换的逆转换,但是不能消除const,volatile和对齐。

表达式static_cast<T*>(a), a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。  

 

class B { ... };  
 
class D : public B { ... };  
 
void f(B* pb, D* pd)  
 
{  
 
     D* pd2 = static_cast<D*>(pb);          // 不安全, pb可能只是B的指针  
 
 
 
 
     B* pb2 = static_cast<B*>(pd);          // 安全的  

}

 

 


4.dynamic_cast
就是根据类型信息来cast。理解起来很简单,实际做起来代价不小。

表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针。 

A* pa = new A;  
 
    B* pb = new B;  
 
    void* pv = dynamic_cast<A*>(pa);  
 
    // pv 现在指向了一个类型为A的对象  
 
    ...  
 
    pv = dynamic_cast<B*>(pb);  
 
    // pv 现在指向了一个类型为B的对象  

你可能感兴趣的:(C++,c,Class,alignment)