C++标准转换运算符const_cast

C++提供了四个转换运算符以供显式类型转换,分别是:

  • static_cast < new_type> (expression)
  • dynamic_cast < new_type> (expression)
  • const_cast < new_type> (expression)
  • reinterpret_cast < new_type> (expression)

其中const_cast是用来改变运算对象的底层const的,可以理解为去掉const性质,得到一个可以进行写操作的对象(也可以是增加const性质)。注意const_cast只能改变底层const,所以其操作对象只能为指针或引用。

底层const表示指针所指的对象是一个常量,而顶层const表示指针本身是一个常量

举几个例子:

const int a = 1, *b = &a;
int aa = 1, *bb = &aa;
int c = const_cast<int>(a);    //错误,对象类型不是指针或引用
int *d = cosnt_cast<int*>(b);  //正确,去掉const性质
int *e = const_cast<double*>(b);//错误,const_cast只改变常量属性 
const int cc = const_cast<const int>(aa);    //错误,对象类型不是指针或引用
const int *dd = const_cast<const int*>(bb);  //正确,增加const性质

如上,b原先是个指向常量的指针,我们不能改变(*b)的值,但是通过const_cast转换后我们就可以通过操作d,对(*d)进行写操作了。但是,这里对(*d)的写操作到底能不能改变(*b)的值以及指针指针指向的常量a的值呢?来做个小测试

#include<iostream>
using std::cout;
using std::endl;
int main(){
    const int a = 1, *b = &a;
    int *d = cosnt_cast<int*>(b); 
    *d = 2;
    cout << "a: " << a << “   &a: ” << &a << endl;
    cout << "*b: " << *b << "   b:" << b << endl;
    cout << "*d: " << *d << "   d:" << d << endl;
    return 0;
}   

输出结果为:

a: 1 &a: 0x7fffbe25e8a4
*b: 2 b: 0x7fffbe25e8a4
*d: 2 d: 0x7fffbe25e8a4

可以看到b和d指向的都是a所在的位置,但通过改变(*d)的值,(*b)也随之改变了,但原来指向的常量a并未改变。不过查看《C++ Primer》中关于const_cast的描述,可以得知对(*d)的写操作是未定义的。也就是说,上文中测试得到的结果也只是在当时的编译器下得到的结果,如果换不同的编译器可能a与(*b)的结果会不一样,所以最好不要对const_cast转换得到的结果进行写操作。
不过,如果不做写操作的话,那const_cast去掉或者说改变常量性质的意义何在呢?查了一下,可能是因为实际工程中会有许多复杂的情况,有时可能会出现本不该是const的对象被const引用了(尤其是使用模板时);或者是调用了一个参数是const的函数,但我们要传的参数却不是const的等等情况(尤其是重载的函数),可能会需要用到const_cast转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值