C++:const_cast的简单理解

前言: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=21int* 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 }

原文地址:https://www.cnblogs.com/duwenxing/p/7406043.html