1 reinterpret_cast
'reinterpret_cast'转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型。反之亦然。(译注:是指针具体的地址值作为整数值?)
这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。
如果情况是从一个指针到整型的拷贝,内容的解释是系统相关的,所以任何的实现都不是方便的。一个转换到足够大的整型能够包含它的指针是能够转换回有效的指针的。
代码:
class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);
'reinterpret_cast'就像传统的类型转换一样对待所有指针的类型转换
static_cast 主要用于对c++中的基本数据类型进行交换并且对于类而言只能对转换有关系的类不能没有关系
具体事例:
float a=10.00;
int b=static_cast<int>(a);
对于类而言必须有关系例如
class A
{
virtual void show()
{
printf("helloworld\n");
}
}
class B: public A
{
void show()
{
printf("ok");
}
void print();
{
pirntf("hahahhahah");
}
}
int main()
{
B b;
A *p=&b;
p->show();
p->print();//不可以这样因为p中没有这个函数所以要强转为派生类的类型
(static_cast<B*>(p))->print();//ok;
}
派生类指针赋值给基类指针不会出错没什么问题,基类指针赋值派生类会出现问题(所以出现了dynamic_cast)主要没有进行动态类型检查
. 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
dynamic_cast:
'dynamic_cast'只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转换的相反过程),dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象。
检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL.
并且因为其运行中的检查机制导致他的效率没有static_cast 高
const_cast
显而易见去除变量的常属性(static_cast 和 reinterpreter_cast)都没用
const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。
变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。
用法:const_cast<type>(expression)
通过const_cast运算符,也只能将const type*转换为type*,将const type&转换为type&。
也就是说源类型和目标类型除了const属性不同,其他地方完全相同。
测试当定义的const 常量在栈上时的情况(很明显这个说明了栈上的const 常量在栈上)
#include <iostream>
using namespace std;
const int a=0;
int main()
{
const int a=0;
int b=0
int *p=const_cast<int*>(&a);
(*p)++;
cout<<*p<<" "<<p<<endl;
cout<<a<<" "<<&a<<endl;
cout<<b<<" "<<&b<<endl;
}
1 0x7ffd435c9684
0 0x7ffd435c9684
0 0x7ffd435c9680
但是定义的全局const int a=0
定义了一个全局变量并不是和全局变量在一个地方,所以在进行分析全局的const int 修饰的变量在哪定义了一个常量字符串自行看
#include <iostream>
using namespace std;
const int a=1;
char *p="DFADD";
int b=1;
int main()
{
//const int a=0;
//int b=0;
//int *p=const_cast<int*>(&a);
//(*p)++;
//cout<<*p<<" "<<p<<endl;
cout<<a<<" "<<&a<<endl;
cout<<b<<" "<<&b<<endl;
printf("%p",p);
}
wang@wang-PC:~/Desktop$ ./bb
1 0x75e878cbd8
1 0x75e898d060
0x75e878cbdc
貌似里只读数据段近一些所以只读数据段不允许修改貌似符号表也存储在只读数据段上所以如果去全局的const变量的属性然后操作会出现段错误
总结
const_cast 去掉后的类型和原类型除const属性全相同,并且两个地址一样但值因为const属性不一样,具体参考,const_cast 只能去掉栈上变量进行操作,无法对全局的const变量进行操作