const_cast运算符(仅限C++)

前言

C++提供了四种类型转换操作符,

  • const_cast
  • static_cast
  • dynamic_cast
  • reinterpret_cast

对于const_cast,大部分书籍是这样描述它的:

  1. const_cast将转换表达式的const或者volatile性质。
  2. 四种类型转换操作符中,剩余三种无法转换const性质,强制转换会导致编译错误。
  3. const_cast只能转换const或者volatile特性,转换其他性质将会导致编译错误。

疑惑

先来看一段代码:

const int a = 22;
int *b = &a;

在c中这段代码可以编译,顶多出现一个warning,之后便可以对b进行操作了,也就是说改变了a和b的值,const就失去了意义。但是在c++中是不允许的,编译无法通过,const的值是无法改变的。
对于前面描述的第一点,我还以为它能改变const的值,但是我试了下:

#include<iostream>

int main()
{
	const int constant = 22;
    std::cout<<"constant = "<<constant<<std::endl;

    const int* const_p = &constant;
    int* modifier = const_cast<int*>(const_p);
    std::cout<<"constant = "<<constant<<"   add of constant: "<<&constant<<std::endl;
    std::cout<< "*const_p = " <<*const_p<<"     add of *const_p: " <<const_p<<std::endl;
    std::cout<<"*modifier = "<< *modifier<<"   add of modifier: "<<modifier<<std::endl;

    *modifier = 7;
     std::cout<<"constant = "<<constant<<"   add of constant: "<<&constant<<std::endl;
     std::cout<< "*const_p = " <<*const_p<<"     add of *const_p: " <<const_p<<std::endl;
     std::cout<<" *modifier = "<< *modifier<<"   add of modifier: "<<modifier<<std::endl;
     
    return 0;
}

编译输出结果之后:

constant = 22   add of constant: 0x7ffc25e769bc
*const_p = 22     add of *const_p: 0x7ffc25e769bc
*modifier = 22   add of modifier: 0x7ffc25e769bc
constant = 22   add of constant: 0x7ffc25e769bc
*const_p = 7     add of *const_p: 0x7ffc25e769bc
*modifier = 7   add of modifier: 0x7ffc25e769bc

看结果可以知道,constat变量并未改变,只是const_p指针指向的内容改变了,看来C++还是很严谨的,常量值无法改变。

作用

那么问题来了,const_cast既然不能改变const值,有什么作用呢?
我们调用一个参数不是const类型的函数,但是传进去的参数是const,这时候const_cast作用就显现出来了:

#include<iostream>

void getMaxValue(int * num) ;

int main()
{
     const int constant = 22;
    const int* const_p = &constant;
    getMaxValue(const_p);

    return 0;
}

void getMaxValue(int *num) {return;}

编译时报错:

test12.cpp:9:24: error: invalid conversion from ‘const int*’ to ‘int*[-fpermissive]
     getMaxValue(const_p);

如果改成:

getMaxValue(cosnt_cast<int*>(const_p));

那么编译通过,顺利执行。
在这种情况下,我们初心并不是为了改变变量值,只是出于无奈,不得不转换类型去调用函数。
除此之外,还有一种很少见的情况,见代码:

 int constant = 22;
 const int* const_p = &constant;

const指针指向了变量,我们后续需要改变constant的值,但是手头上只有指针了,只能通过const_cast来实现了。

int constant = 22;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
*modifier = 23;

这种情况其实是没事找事,有点钻牛角尖的意思,直接constant = 23不就好了嘛。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
reinterpret_cast是C++中的一种类型转换运算符,用于在不同类型之间进行强制转换。它可以将一个指针类型转换为另一个指针类型,或者将一个整数类型转换为指针类型。这种转换是非常危险的,因为它会绕过编译器对类型的检查,并且可能导致未定义行为。因此,在使用reinterpret_cast时需要非常小心并确保转换是安全和合法的。 举个例子,引用中的代码演示了reinterpret_cast的使用。在这个例子中,将一个char指针转换为float指针,然后打印出float指针所指向的值。由于char和float的内存布局不同,这种转换可能会导致错误的结果,因此需要谨慎使用reinterpret_cast。 另外,引用中的代码演示了使用const_cast将常量对象的const属性去除的过程。在这个例子中,将一个const int对象的指针转换为int指针,并修改所指向的值。需要注意的是,修改常量对象的值是一种未定义行为,因此使用const_cast需要慎重考虑。 总之,reinterpret_cast是一种强制类型转换运算符,可以在不同类型之间进行转换,但需要谨慎使用,并确保转换是安全和合法的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)](https://blog.csdn.net/ccc369639963/article/details/122905438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值