Const成员函数可变

const member function mutable

本文关键字:函数 成员 Const      更新时间:2023-10-16

正如我所理解的那样,成员函数末尾的const说明符意味着类的成员不能在该函数中被修改,除非它们被声明为可变的。话虽如此,我有以下几点:

mns::list::list是我的一个链表实现,它的函数不是const。

template<typename T> class HashTable{
private:
      std::vector<mns::list::list<T> * > * hashtable;
      long long int size;
public:
        HashTable(int _size){
             hashtable = new std::vector<mns::list::list<T> * >(_size, NULL);
             size = _size;
       }
        ....
       bool insert(T _value) const {
             long long int hash_value = getHash(_value);
             if (hashtable->at(hash_value) == NULL) hashtable->at(hash_value) = new mns::list::list<T>(_value);
             else if (hashtable->at(hash_value)->find_forward(_value) == -1) hashtable->at(hash_value)->push_top(_value);
       }
       ....
}

在main中有一个函数:

void testhash(){
       HashTable<int> testhashtable1(100);
       std::cout << testhashtable1.find(45) << std::endl;
       testhashtable1.insert(45);
       std::cout << testhashtable1.find(45) << std::endl;
}

考虑到HashTable::insert是一个const函数,我假设我不能修改私有成员HashTable。但是testhash()输出:

0

1

表示成员被修改…对吧?所以我似乎错过了什么…为什么要修改私有成员向量哈希表?

数据成员是指向vector的指针。在const成员函数insert中,所有数据成员都是const,所以你的数据成员现在被认为是指向向量的const指针。由于您不尝试修改指针本身(例如hashtable = nullptr),而是修改它所指向的向量,因此向量将被修改。

  • 指向某种类型的const指针

  • 指向const类型的指针

它们完全不同

成员函数的const说明符允许在对象为const时调用该函数。因此,该函数不允许修改成员或调用非const成员函数。