首页 > 编程语言 > 详细

c++的类型转换

时间:2020-01-05 21:39:31      阅读:62      评论:0      收藏:0      [点我收藏+]

对比c,为什么要扩展类型转换运算符

在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)

dynamic_cast

为了实现多态性,经常会用到虚函数,就会有这样的操作:用基类的指针指向派生类的对象

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_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的值是不变的

c++的类型转换

原文:https://www.cnblogs.com/ljqblogs/p/12153560.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!