2016-11-17 2 views
0

Wie ich zu verstehen bin, bedeutet der const-Bezeichner am Ende einer Member-Funktion, dass die Member der Klasse innerhalb dieser Funktion nicht geändert werden können, es sei denn, sie werden als veränderlich deklariert. Nachdem ich gesagt habe, dass ich folgendes habe:const Member-Funktion veränderbar

mns :: list :: list ist eine verkettete list implementierung von mir welche funktionen sind nicht 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); 
     } 

     .... 
} 

und ich habe eine Funktion in meinem Haupt:

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

Da HashTable :: insert eine konstante Funktion ist i angenommen, dass ich nicht privat Mitglied hashtable ändern würde. Aber testhash() druckt:

, die das Element bedeutet, wurde modifiziert, ... nicht wahr? Also ich vermisse etwas hier ... Warum wurde der private Member-Vektor hashtable modifiziert?

+1

'long long int' ist sehr alte Art und Weise' zu ​​schreiben intmax_t' oder 'ssize_t'. Aber wenn Sie eine Größe wünschen, ist es vielleicht besser, eine Ganzzahl ohne Vorzeichen zu haben? wie das 'uintmax_t' oder 'size_t'. Und Sie können Größe eines Vektors mit [Größe Methode] haben (http://www.cplusplus.com/reference/vector/vector/size/) – Stargateur

+0

@Stargateur 'ssize_t' ist nicht Teil des Standards. 'size_t' ist. –

Antwort

4

Ihr Datenelement ist ein Zeiger auf einen Vektor. In der const Elementfunktion insert werden alle Datenelemente const sein, so dass Ihr Datenelement jetzt als Const-Zeiger auf einen Vektor betrachtet wird. Da Sie nicht versuchen, den Zeiger selbst zu ändern (z. B. hashtable = nullptr), sondern den Vektor, auf den er zeigt, wird der Vektor modifiziert.

0

Der Spezifizierer const für Elementfunktionen ermöglicht den Aufruf der Funktion, wenn das Objekt const ist. Daher ist es der Funktion nicht erlaubt, Member zu ändern oder nicht-konstante Member-Funktionen aufzurufen.

1
  • ein const Zeiger auf irgendeine Art

  • ein Zeiger auf ein const Typ

sie völlig unterschiedlich sind