看了一部分关于强制类型的转换,感觉讲的比较零散,做下关键信息汇总:
一、C风格的类型转换:
C风格的强制转换风格如下:
TypeName b = (TypeName)a;
完全靠程序员的经验对程序的结果负责。
二、C++风格的强制类型转换函数
1、const_cast
这个转换函数,可以去掉const变量的const属性,关键是:有什么用!
#include<iostream>
using namespace std;
int func(int& a,int& b)
{
a = 1;
b = 2;
return a;
}
int main()
{
const int i = 20;
const int j = 30;
int & testi = const_cast<int&>(i);
int & testj = const_cast<int&>(j);
int max = func(testi, testj);
cout << "i:["<<i<<"],test:["<<testi<<"],&i:["<<&i<<"],&test:["<<&testi<<"],max:"<<max << endl;
cin.get();
return 0;
}
运行结果为:
i:[20],test:[1],&i:[010FFD04],&test:[010FFD04],max:1
func函数不能接受i、j参数,编译阶段即会报错。但是testi、testj由于本身类型是int,可以作为参数。
testj、testj的修改并不会影响i、j的值,这是区别于常规引用的地方。
因此我比较赞同有个人说的:“所以,const_cast的目的并不是为了让你去修改一个本身被定义为const的值,因为这样做的后果是无法预期的。const_cast的目的是修改一些指针/引用的权限,如果我们原本无法通过这些指针/引用修改某块内存的值,现在你可以了。”
2、static_cast
强制类型转换,作用:
a、隐形的基本类型转换
b、派生类转换为基类(上行、安全),基类转换为派生类(下行,不安全)
3、dynamic_cast
#include<iostream>
using namespace std;
class A {
public:
virtual void show()
{
cout << "A" << endl;
}
};
class B : public A {
public:
virtual void show()
{
cout << "B" << endl;
}
};
class C : public B {
public:
virtual void show()
{
cout << "C" << endl;
}
};
int main()
{
A a;
B b;
C c;
C* p = static_cast<C*>(&a);//p->show()输出A
//C* p = dynamic_cast<C*>(&a);//p为空指针
//A* p = dynamic_cast<A*>(&c);//p->show()输出C
//C* p = reinterpret_cast<C*>(&a);//p->show()输出A
if (NULL == p)
{
cout << "error" << endl;
cin.get();
return -1;
}
p->show();
cin.get();
return 0;
}
dynamic_cast对于基类的指针转换为派生类的指针的场景,会返回空指针。对于基类引用转换为派生类引用的场景,会抛出std::bac_cast异常。可在RTTI场景下保证程序类型转换的安全性。
4、reinterpret_cast
基于内存位的类型转换,强制转换,不计后果,一定能够编译通过。安全性全靠程序员自己检查。