Chinaunix首页 | 论坛 | 博客
  • 博客访问: 109447
  • 博文数量: 17
  • 博客积分: 1430
  • 博客等级: 上尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-13 12:10
文章分类
文章存档

2010年(1)

2009年(5)

2008年(11)

我的朋友

分类: C/C++

2009-12-18 13:40:06

1、静态转换(static_cast)
 
static_cast包含的转换类型有典型的非强制变换窄化(有信息丢失)变换使用void*的强制转换隐式类型变换类层次的静态定位。static_cast是编译器允许的。
 
(1)典型的非强制变换:
从窄类型向宽类型的转换,如char向short int,int,long int,float,double,long double的转换。
char a = 1;
long b = static_cast(a);
 
(2)窄化变换:
与第1种相反,从宽类型向窄类型的变换。
long b = 1;
char a = static_cast(b);
 
(3)使用void*的强制变换:
struct callback_param
{
    void *vp;
};
 
int a = 1;
struct callback_param cp;
cp.vp = &a;      //编译器允许从任意类型指针向void*转换
 
int *ip = static_cast(cp.vp);
 
(4)隐式类型转换:
包括(1)(2)
 
(5)类层次的静态定位
进行向上类型转换(派生类向基类转换)时,编译器清楚派生自什么祖先类,除了多继承(多继承转换后可能不为原地址,指针会在类层次中调整)。
 
 
 
2、常量转换(const_cast)
从const转换为非const,从volatile转换为非volatile。取得const对象的地址,会生成一个指向const的指针,volatile同。
 
const int i = 0;
int *ip = const_cast(&i);
 
volatile int a = 0;
int *ap = const_cast(&a);
 
3、重解释转换(reinterpret_cast)
最不安全的一种转换机制,将对象转变为完全不同类型的对象,这是低级的位操作。
 
struct msg_hdr
{
    int msg_type;
    int msg_len;
    char msg_data[0];
};
 
struct msg_data
{
    int data1;
    int data2;
};
 
struct msg_hdr *p = reinterpret_cast(recvbuf);
struct msg_data *pdata = reinterpret_cast(p->msg_data);
 
4、动态转换(dynamic_cast)
类层次的向下转换(基类向派生类转换),转换过程中会通过RTTI检查转换类型是否正常,不正常将返回空。

#include
using namespace std;

class pet
{
    public:
    virtual ~pet()
    {
    }
};

class dog : public pet
{
};

class cat : public pet
{
};

int main(void)
{
    pet *b = new cat;

    dog *d1 = dynamic_cast(b);
    cat *d2 = dynamic_cast(b);

    cout << "d1 = " << (long)d1 << endl;  // d1 = 0
    cout << "d2 = " << (long)d2 << endl;

}
 
 
 
阅读(2844) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~