在c语言中,类型转换是怎么样的呢,是在赋值的右边加上(类型名),比如:
int a = 5;
double * pb = (int)a;
char c = (char) pb;
这种转换没有任何限制,也就是说任意类型都可以转换成另一种类型而不加限制,在右边加上强制转换有什么意义呢?可能唯一的意义就是让编译器提醒你要注意安全性
c++认为这种是不太安全的,增加了限制更加严格的4个类型转换操作符:dynamic_cast
,const_cast
,static_cast
,reinterpret_cast
他们的语法格式都一样,比如dynamic_cast的语法:dynamic_cast < type-name > (expression)
为了实现多态性,经常会用到虚函数,就会有这样的操作:用基类的指针指向派生类的对象
class Base
{
virual f();
}
class Derived
{
virual f();
g();
}
class Derived* pl = new Derived;
class Base* ph = pl;
如果反过来会有什么问题呢?即class Derived* pl = ph
很明显,派生类继承基类,是一个包含的关系,如果用pl->g()的话,基类中没有对应的g()的实现,这样是不安全的,应该加以限制,dynamic_cast的用途就是限制在类层次关系中只能向上转换
ph = dynamic_cast<Base *>(pl)
这个是在运行中赋值的,如果pl不是ph的可访问基类,那么就返回null,这个转换对比其他是有开销的
const_cast的应用情况比较简单,有一种情况是这样的,对于一个变量大多数时候我们希望它不变,但是可能偶尔要改变它的值
const_cast是用于把const变量变成非const变量,而且不能把一种类型改变成另一种类型
举个c++ primer plus书中的例子
void change(const int *pt, int n)
{
int * pc;
//pc = (int *)pt;//c语言中可以把pt转换成非int类型
pc = const_cast<int *>(pt);//pc和pt必须是同一种类型
*pc += n;
}
int main()
{
int pop1 = 38383;
const int pop2 = 2000;
cout << "pop1, pop2: " << pop1 << ", " << pop2 << endl;
change(&pop1, -103);
change(&pop2, -103);
cout << "pop1, pop2: " << pop1 << ", " << pop2 << endl;
return 0;
}
输出
pop1, pop2: 38383, 2000
pop1, pop2: 38280, 2000
尽管change函数里把const类型转换为非const类型了,但pop2的初始类型是const类型的,pop2的值是不变的
原文:https://www.cnblogs.com/ljqblogs/p/12153560.html