17.2 类型转换操作符

    C++中添加了4个类型转换符,用以对数据类型的转换进行更严格的限制,它们分别是dynamic_cast、const_cast、static_cast和reinterpret_cast,同前面所讲的类型转换机制相比,新机制让程序员根据需要选择要使用的操作符,明确了转换意图,可读性更强,而且编译器可方便地对转换是否安全进行检查,能排查出很多在传统类型转换中无法找出的问题,动态操作符dynamic_cast已在上节介绍过,本节对其余3个静态类型转换操作符进行讲解。

    17.2.1 const_cast操作符

    const_cast的基本使用格式如下所示。


    const_cast<T>(expr);

    expr应该为指针和引用的形式,该操作符不会影响expr,除了const和volatile修饰符等,T应与expr类型相同,返回一个新的T型变量,与expr有相同的值,如示例代码17.2所示。

    代码17.2 const_cast用法ConstCastSample


    <——————————————-文件名:example1702.cpp————————————-> 01 #include<iostream> 02 using namespace std; 03 int main(){ 04 int i=5; 05 const int*ci=&i;//ci指向的单元不可改写 06 (const_cast<int>(ci))=8;//去除了const属性 07 cout<<i<<endl; 08 cout<<(*ci)<<endl; 09 return 0; 10 }

    输出结果如下所示。


    8 8

    【代码解析】通过代码第5行语句“const intci=&i;”声明的指针ci原则上是不可改写间接引用的,但代码第6行语句“(const_cast<int>(ci))=8;”消除了其const属性,使得ci指向的值修改为8,语句“(const_cast<int*>(ci))=8;”实际上等价于以下代码。


    intp=const_cast<int>(ci); *p=8;

    注意

    p和ci是两个不同的变量(&p!=&ci),两者只是取值相同(p==ci)。