C++:const_cast的简单理解
2017-08-21 18:32
309 查看
前言:const_cast是我比较头疼的一个知识点,最近查阅了很多资料,也翻看了很多他人的博客,故在此将自己目前学习到的有关const_cast知识做一个简单的总结
特别注意:
(1) const_cast只能改变运算对象的底层const,也就是说:
•常量指针转化为非常量的指针,并且仍然指向原来的对象
•常量引用转化为非常量的引用,并且仍然指向原来的对象
(2) 不能用const_cast改变表达式的类型
(3)使用const_cast把一个原本const的变量转换为非const是一个非定义行为(未定义行为指的是这个语句在标准C++中没有的规定,由编译器来决定如何处理)
![](https://images2017.cnblogs.com/blog/900715/201708/900715-20170821185313574-184569237.png)
由上面这个例子可以看出,在C++中对于添加const关键字的变量,其就是常量,不必担心其他机制(如const_cast)会改变其值。而对于未定义行为,应当尽量避免出现这样的语句
同样,用对非常量的引用绑定常量对象是非法的
但另一方面,在C++编程过程中可能会出现某些变量原本不是const对象,但由于某些特殊的原因,在编程者不经意的情况下将其转换为了const对象,从而引发以上的错误,此时就需要cosnt_cast来消除const的影响
例如:
1.一个函数的参数不是const对象,并且编程者事先已经知道在这个函数中不会对参数进行修改,但需要传递的实参却是已经定义好的const对象。为了成功调用这个函数,就需要利用到const_cast在实参传递前对其进行处理,从而使函数能够成功接收这个实参
2.如果我们定义了一个非const的变量,却使用了一个指向const对象的指针来指向它,而在程序的某处希望改变这个变量时发现只有指针可用,此时就可以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;
![](https://images2017.cnblogs.com/blog/900715/201708/900715-20170821185313574-184569237.png)
由上面这个例子可以看出,在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 }
![](https://images2017.cnblogs.com/blog/900715/201708/900715-20170821205941043-687645350.png)
相关文章推荐
- 简单理解static_cast, dynamic_cast, reinterpret_cast和const_cast的区别和应用
- 【C语言 C++】简单keywordRegister,Const,Static,Volatile,typedef,Define的理解
- 深入理解C++标准类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- 【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解
- C++类型cast之static/dynamic/reinterpret/const
- 总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)
- C++标准转换运算符const_cast
- C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析
- c++11 使用c++风格的cast: static_cast<type>(expression) const_cast<type> dynamic_cast reinterpret_cast
- C++中的四种强制转换 dynamic_case,const_cast,static_case,reinterprer_case的不同
- 【C++专题】static_cast, dynamic_cast, const_cast探讨
- C++中static_cast、const_cast、reinterpret_cast的用法举例,附带举例说明强制类型转换时int和int&的区别
- C++:const用法的简单总结
- 理解复杂的C/C++声明 const, typedef , 函数指针
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- 标准C++的类型转换:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- 【C++专题】static_cast, dynamic_cast, const_cast探讨
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- C++中的static_cast,dynamic_cast,const_cast,reinterpret_cast
- C++四种强制类型转换符功能以及用法总结(dynamic_cast,const_cast,static_cast,reinterpret_cast)