C++标准转换运算符const_cast

来源:互联网 发布:淘宝代码怎么用的 编辑:程序博客网 时间:2024/06/05 22:40

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转换。

原创粉丝点击