const成员函数可变

问题描述:

由于我给予理解,在一个成员函数的端部的常量说明符意味着该类的成员不能修改,在该函数内,除非它们被声明为可变的。 话虽如此,我有以下几点: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); 
     } 

     .... 
} 

和我在我的主要功能:

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

鉴于哈希表::刀片是const函数我认为我将无法修改私有成员哈希表。但testhash()打印:

这意味着被修改的构件是吗? 所以我似乎错过了这里的东西......为什么私人会员矢量哈希表修改?

+1

'长长int'是写'很旧的方式intmax_t'或'ssize_t'。但是如果你想要一个大小,也许最好有一个无符号整数?像'uintmax_t'或'size_t'。并且可以具有[大小的方法]的矢量的大小(http://www.cplusplus.com/reference/vector/vector/size/) – Stargateur

+0

@Stargateur'ssize_t'不是标准的一部分。 'size_t'是。 – 2016-11-17 15:27:50

你的数据成员是一个指针,指向向量。在const成员函数insert所有数据成员将const,让您的数据成员现在被认为是一个const指针的向量。既然你不尝试修改指针本身(例如hashtable = nullptr),但通过矢量它指出,向量将被修改。

const说明符成员函数允许,如果对象是const被调用的函数。因此该函数不允许修改成员或调用非const成员函数。

  • 一个const指向某种类型的

  • 一个指向某个常数类型

他们是完全不同的