您的位置:首页 > 编程语言 > C语言/C++

C++:const_cast的简单理解

2017-08-21 18:32 309 查看
前言:const_cast是我比较头疼的一个知识点,最近查阅了很多资料,也翻看了很多他人的博客,故在此将自己目前学习到的有关const_cast知识做一个简单的总结

一、什么是const_cast

简单来说,const_cast是C++提供的四种显示类型转换的方式之一,其主要作用是移除变量的const限定符从而改变表达式的常量属性

语法:const_cast<type_id>(expression);


特别注意:

(1) const_cast只能改变运算对象的底层const,也就是说:

  •常量指针转化为非常量的指针,并且仍然指向原来的对象

  •常量引用转化为非常量的引用,并且仍然指向原来的对象

1 const int value=12;
2 int new_value=const_cast<int>(value); //错误:const_cast只能改变运算对象的底层const,而对顶层const无能为力(编译信息:[Error] invalid use of const_cast with type 'int', which is not a pointer, reference, nor a pointer-to-data-member type)
3
4 const int* value_ptr=&value;
5 int *ptr=const_cast<int*>(value_ptr);//正确:将常量指针转化为非常量指针,并仍然指向原来的对象
6
7 const int& value_re=value;
8 int& re=const_cast<int&>(value_re);//正确:将常量引用转化为非常量引用,并仍然指向原来的对象


(2) 不能用const_cast改变表达式的类型

1 const char* cp;
2 const_cast<string>(cp); //错误:const_cast不能改变表达式类型,只能改变常量属性


(3)使用const_cast把一个原本const的变量转换为非const是一个非定义行为未定义行为指的是这个语句在标准C++中没有的规定,由编译器来决定如何处理

1 const int value=21;
2 const int* value_ptr=&value;
3 int* ptr=const_cast<int*>(value); //通过ptr写值是未定义行为
4 *ptr=3;




由上面这个例子可以看出,在C++中对于添加const关键字的变量,其就是常量,不必担心其他机制(如const_cast)会改变其值。而对于未定义行为,应当尽量避免出现这样的语句

二、什么时候使用const_cast

在C++中,用指向非常量的指针来指向常量对象是非法的

const int value=21;
int* ptr=&value;//错误: invalid conversion from 'const int*' to 'int*'


同样,用对非常量的引用绑定常量对象是非法的

1 const int value=3;
2 int &new_value=value; //错误:invalid initialization of reference of type 'int&' from expression of type 'const int'


但另一方面,在C++编程过程中可能会出现某些变量原本不是const对象,但由于某些特殊的原因,在编程者不经意的情况下将其转换为了const对象,从而引发以上的错误,此时就需要cosnt_cast来消除const的影响

例如:

1.一个函数的参数不是const对象,并且编程者事先已经知道在这个函数中不会对参数进行修改,但需要传递的实参却是已经定义好的const对象。为了成功调用这个函数,就需要利用到const_cast在实参传递前对其进行处理,从而使函数能够成功接收这个实参

1 #include<iostream>
2 using namespace std;
3 void Function(int *val){
4     cout<<*val<<endl;
5 }
6 int main(){
7     const int value=21;
8     Function(const_cast<int*>(&value));
9     return 0;
10 }


2.如果我们定义了一个非const的变量,却使用了一个指向const对象的指针来指向它,而在程序的某处希望改变这个变量时发现只有指针可用,此时就可以const_cast进行处理

1 #include<iostream>
2 using namespace std;
3 int main(){
4     int value=26;
5     const int* const_ptr=&value;
6     int* ptr=const_cast<int*>(const_ptr);
7     *ptr=3;
8     cout<<"value:"<<value<<endl;
9     cout<<"*const_ptr:"<<*const_ptr<<endl;
10     cout<<"ptr:" <<*ptr<<endl;
11     return 0;
12 }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐