2016-11-17 171 views
0

由於我給予理解,在一個成員函數的端部的常量說明符意味着該類的成員不能修改,在該函數內,除非它們被聲明爲可變的。 話雖如此,我有以下幾點: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

回答

4

你的數據成員是一個指針,指向向量。在const成員函數insert所有數據成員將const,讓您的數據成員現在被認爲是一個const指針的向量。既然你不嘗試修改指針本身(例如hashtable = nullptr),但通過矢量它指出,向量將被修改。

0

const說明符成員函數允許,如果對象是const被調用的函數。因此該函數不允許修改成員或調用非const成員函數。

1
  • 一個const指向某種類型的

  • 一個指向某個常數類型

他們是完全不同的