C++ Primer阅读笔记--const_cast的使用

1--const_cast

        const_cast 只能改变运算对象的底层 const (指针的指向可以改变,指针指向的值不能修改,类似于指向常量的指针),对于将常量对象转换成非常量对象的行为,一般称其为 “去掉const性质”;
        一旦去掉某个对象的 const 性质,编译器就不会阻止对该对象进行写操作;

#include "iostream"
 
int main(int argc, char* argv[]){
    const int a = 30;
    const int *p = &a;
    int *q = const_cast<int*>(p);
    *q = 10;
 
    std::cout << "a: " << a << std::endl;
    std::cout << "*p: " << *p << std::endl;
    std::cout << "*q: " << *q << std::endl;
 
    std::cout << "&a: " << &a << std::endl;
    std::cout << "p: " << p << std::endl;
    std::cout << "q: " << q << std::endl;
 
    return 0;
}

        当使用 const 声明一个常量时,在 C++ 中会把这个常量写到 ROM(磁盘)中,并且这个 ROM 地址会映射到内存,指向的地址不变。
        当使用 const_cast 去掉 const 限定后,将地址赋给另外的变量指针;当改变变量指针的值时,实际上是改变了内存地址中存的数据,但并没有改变在外存(磁盘)中的数据。因此当读取变量指针的值时,其实是取内存中的数据,当使用原常量名时取的是外存中的数据;

#include "iostream"

int main(int argc, char* argv[]){
    int a = 30;
    const int *p = &a;
    int *q = const_cast<int*>(p);
    *q = 10;

    std::cout << "a: " << a << std::endl;
    std::cout << "*p: " << *p << std::endl;
    std::cout << "*q: " << *q << std::endl;

    std::cout << "&a: " << &a << std::endl;
    std::cout << "p: " << p << std::endl;
    std::cout << "q: " << q << std::endl;

    return 0;
}

上面两个代码的执行结果表明:

① 在C++中常量的确不能被修改,例如第一个例子中的 a;

② 当使用一个常量指针(const int *p)指向一个非常量值 (a) 时,不能通过解引用 (*p) 来修改这个值,但可以利用 const_cast 来去除 const 限定,通过新指针的解引用 (*q) 来修改这个非常量值;​​​​​​​

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值