Advanced C++ -- Logic Constness and Bitwise Constness

本文探讨了C++中的LogicConstness和BitwiseConstness概念,通过实例展示了如何在函数和变量上应用const修饰符,以及它们在代码实现中的作用。重点解释了在const修饰的函数内如何安全地修改变量,以及Quiz部分如何正确理解和使用const修饰符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  首先介绍一下什么是Logic Constness和Bitwise Constness,Logic Constness指的是function 后的const修饰,我们只知道这个function被const修饰了,但是并没有任何变量被const,Bitwise Constness指的是变量(指针,或者引用等,基本上任何的二进制储存值)被const修饰,那么我们下面就用例子来进行探索。

#include<iostream>
#include<vector>
#include<string>
using namespace std;

class BigArray{
    vector<int> v;
    int accessCounter;
    int *v2;

public:
    int getItem(int index) const{
        //accessCounter++;
        const_cast<BigArray*>(this)->accessCounter++;
        return v[index];
    }

    void setV2Item(int index, int x){
        *(v2+index) = x;
    }

    // Quiz:
    const int* const fun(const int* const& p) const{
        //return accessCounter++;
    }
};

int main(){
    
    BigArray b;
}

  首先我们看getItem函数,因为这个函数不对对象的数据进行任何修改,所以我们将其修饰为const,一开始我们注释掉前两句,只有return v[index]; 发现程序编译通过,因为没有任何修改实例变量的操作,但是如果我们注释掉第一行,也就是accessCounter++; 我们就会发现,程序编译报错了,报错的原因就是getItem是Logic Const的函数,所以里面不能够对变量进行修改,因为这样就是打破了Bitwise Constness,但是是不是我们就不能对accessCounter进行修改呢?其实并不是,大致有两种方法可以对其进行修改:

  1. 使用mutable,在变量前面使用mutable进行修饰,这样就可以在const修饰的函数中进行修改。
  2. 还有一种C++方式,但是并不推荐的就是,使用const_cast对变量的const属性进行cast,这样就可以进行修改而不报错,但是此方法还是不推荐的,实际上在实际开发中,const修饰function的目的就是控制其不能修改变量值。

  再解答一下Quiz的一长串const修饰到底意味着什么:

  1. func的返回值为const的int值,其值为const,指针也为const,表示value和pointer都不可更改
  2. func的参数是一个指向const integer的const指针的引用
  3. func也是一个const function,说明不能直接对类中的变量进行修改,并且只能调用其他const函数

转载于:https://www.cnblogs.com/RookieCoder/p/5088895.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值