【问题标题】:const member function mutableconst 成员函数可变
【发布时间】:2016-11-17 14:57:28
【问题描述】:

据我所知,成员函数末尾的 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 函数,我假设我无法修改私有成员哈希表。但是 testhash() 打印:

0

1

这意味着该成员已被修改...对吗? 所以我似乎在这里错过了一些东西......为什么私有成员向量哈希表被修改了?

【问题讨论】:

  • long long int 是写intmax_t 或ssize_t 的非常古老的方式。但是如果你想要一个大小,也许最好有一个无符号整数?就像uintmax_t 或size_t。您可以使用size method 获得向量的大小
  • @Stargateur ssize_t 不是标准的一部分。 size_t 是。

标签: c++ constants


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    • 指向某种类型的 const 指针

    • 指向某个 const 类型的指针

    他们完全不同

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-29
        • 2011-06-04
        • 2011-11-15
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多