zoukankan      html  css  js  c++  java
  • 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 }

  • 相关阅读:
    如何查看MySQL的当前存储引擎?
    转载mysql数据库配置优化
    redis教程
    基于 Android APP 安全测试流程
    移动APP安全测试
    自动化测试用例如何进行参数化
    分享一波免费的PPT模板下载网站
    UI自动化-滑块验证码识别 java版本
    安全测试博客汇总
    妙手回春——GRUB系统引导器恢复指南
  • 原文地址:https://www.cnblogs.com/duwenxing/p/7406043.html
Copyright © 2011-2022 走看看