cpp中的类型转换

类型转换

static_cast

static_cast主要用于不同类型变量之间的转换及左值转右值等.

1
2
3
4
5
6
7
//不同类型之间的转换
double d = 10.1;
int i = static_cast<int>(d);

//左值转右值
int lv = 10;
int && rv = static_cast<int&&>(lv);

而对于类对象来说,static_cast不能直接将一种类对象转成另一种类对象。但你可以利用static_cast将基类指针/引用转成子类指针/引用.(父子关系的类之间才可以做如上转换,否则编译失败)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class A{
public:
int a;
};

class B:public A {
public:
int b;
};

class C {
public:
int c;
};

int main(int argc, char *argv[]){
A a;
B b;
b = static_cast<B>(a); //不允许static_cast将一个对象转成另一个对象
}

有父子关系的 将基类的指针/引用 转成子类的指针/引用
...
A ca;
B & crb = static_cast<B&>(ca);
...
A * pa = new A();
B * cpb = static_cast<B*>(pa);
...

...
double *pd = new double();
int * pi = static_cast<int*>(pd); //报错
...

static_cast不允许不同类型之间指针/引用的转换(有父子关系的类对象除外)

指针和引用的转换不能用static_cast,而应该用reinterpret_cast。

reinterpret_cast

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
...
double *pd = new double();
int * pi = reinterpret_cast<int*>(pd);
...
double* 转成 int*


...
double d = 10.1;
int i = reinterpret_cast<int>(d);
...这样转化时不可以的。会报错


...
int a = 10;
long ll = reinterpret_cast<long>(&a);
double *dd = reinterpret_cast<double*>(ll);
...可以将指针转成长整型,也可以将长整型转成指针 上述是将int*转成 long型,有将long型转化成double*型



对于对象指针/引用的转换与普通类型的指针/引用转换是一样的。因此不同类型的对象指针/引用可以随意转换,但转换后是否会引起问题它不关心,这要由开发人员自己保证。
A * pa = new A();

B b;
B & rb = B();

C * cc = reinterpret_cast<C*>(pa);
C & rcc = reinterpret_cast<C&>(rb);

reinterpret_cast是对指针/引用的转换,其中必须至少有一个是指针或引用,否则它会报错。

const_cast

去掉指针/引用中的const限制。这里要注意的是被转换的一定是指针/引用的const,而常数的const是不能去掉的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
... 可以
const int * pca = new int(10);
int * pa = const_cast<int*>(pca);
...

... 不可以 常数的const不可以去掉
const int a = 10;
int b = const_cast<int>(a);
...

是否可以将一种类型的const指针转换成另一种类型的非const指针呢
... 不可以,对于const_cast来说,它只能将同一类型的const 指针/引用 转成非const指针/引用。
const int * pca = new int(10);
double * pa = const_cast<double*>(pca);
...

const_cast是一个专门去掉同一类型的const限制的类型转换方法

dynamic_cast

一、它只能处理类对象;二、它只能处理指针;三、它只能用于将子对象转换成父对象这样的操作。

1
2
3
4
5
6
...
A * a;
B * b =new B();
a = dynamic_cast<A*>(b);
...
只有这样能成功,其他都会失败
-------------本文结束感谢您的阅读-------------