(转)C++强制类型转换

 
转换 问题 ,很多 讨论过 ,写的最 详细 的是 C++ 之父的《 C++ 设计 和演化》。最好的解决方法就是不要使用 C 格的 转换 ,而是使用 C++ 转换 符: static_cast, dynamic_cast C++ 中有四个 转换 符: static_cast dynamic_cast reinterpret_cast 、和 const_cast 。下面 一一 行介

static_cast

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

运算符把 expression 转换为 type-id 型,但没有运行 时类 检查 来保 证转换 的安全性。 它主要有如下几 用法:
·                               用于 类层 构中基 和子 或引用的 转换 行上行 转换 (把子 的指 或引用 转换 成基 表示)是安全的; 行下行 转换 (把基 或引用 转换 成子 表示) ,由于没有 动态类 检查 ,所以是不安全的。
·                               用于基本数据 型之 转换 ,如把 int 转换 char ,把 int 转换 enum 这种转换 的安全性也要 开发 来保
·                               把空指 针转换 成目 标类 型的空指
·                               把任何 型的表达式 转换 void 型。
注意: static_cast 不能 转换 expression const volitale 、或者 __unaligned 属性。

dynamic_cast

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

运算符把 expression 转换 type-id 型的 象。 Type-id 的指 的引用或者 void * ;如果 type-id 针类 型,那 expression 也必 是一个指 ,如果 type-id 是一个引用,那 expression 也必 是一个引用。

dynamic_cast 主要用于 类层 的上行 转换 和下行 转换 可以用于 的交叉 转换

类层 间进 行上行 转换时 dynamic_cast static_cast 的效果是一 的;在 行下行 转换时 dynamic_cast 具有 检查 的功能,比 static_cast 更安全。
class B{

public:

int m_iNum;

virtual void foo();

};

class D:public B{

public:

char *m_szName[100];

};



void func(B *pb){

D *pd1 = static_cast<D *>(pb);

D *pd2 = dynamic_cast<D *>(pb);

}

在上面的代 段中,如果 pb 指向一个 D 型的 象, pd1 pd2 是一 的,并且 对这 两个指 针执 D 型的任何操作都是安全的;但是,如果 pb 指向的是一个 B 型的 象,那 pd1 将是一个指向 该对 象的指 D 型的操作将是不安全的(如 访问 m_szName ),而 pd2 将是一个空指 。另外要注意: B 要有虚函数,否 编译 static_cast 没有 个限制。 是由于运行 时类 检查 需要运行 时类 型信息,而 个信息存 的虚函数表( 于虚函数表的概念, 详细 <Inside c++ object model> )中,只有定 了虚函数的 才有虚函数表,没有定 虚函数的 是没有虚函数表的。

另外, dynamic_cast 支持交叉 转换 cross 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); //copile error

D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL

delete pb;

}

在函数 foo 中,使用 static_cast 转换 是不被允 的,将在 编译时 ;而使用 dynamic_cast 转换则 是允 的, 果是空指

reinpreter_cast

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

type-id
是一个指 、引用、算 术类 型、函数指 或者成 它可以把一个指 针转换 成一个整数,也可以把一个整数 转换 成一个指 (先把一个指 针转换 成一个整数,在把 整数 转换 成原 型的指 可以得到原先的指 针值 )。

运算符的用法比 多。

const_cast

用法: const_cast <type_id> (expression)

运算符用来修改 型的 const volatile 属性。除了 const volatile 之外, type_id expression 型是一 的。

常量指 化成非常量指 ,并且仍然指向原来的 象;常量引用被 转换 成非常量引用,并且仍然指向原来的 象;常量 象被 转换 成非常量 象。

Voiatile const 类试 如下一例:
class B{

public:

int m_iNum;

}

void foo(){

const B b1;

b1.m_iNum = 100; //comile error

B b2 = const_cast<B>(b1);

b2. m_iNum = 200; //fine
}

上面的代 码编译时 报错 ,因 b1 是一个常量 象,不能 行改 ;使用 const_cast 把它 转换 成一个常量 象,就可以 它的数据成 任意改 注意: b1 b2 是两个不同的
 

你可能感兴趣的:((转)C++强制类型转换)