1

我对这个 const 关键字的含义有点困惑 我有一个这样的类

class ClassA {
public:
    typedef std::tr1::shared_ptr<ClassA> ptr;
    typedef std::tr1::shared_ptr<const ClassA> const_ptr;
    void oper() const;
    void oper();
private:
    .....
};

int main()
{
    std::list<ClassA::const_ptr> const_list;
    .....
    for(std::list<ClassA::const_ptr>::iterator it = const_list.begin();\
    it != const_list.end(); it++)
    {
        (*it)->oper();
    }
    return 0;
}

我已经从上面的代码中得到了 oper() 的 const 版本。所以我无法想象如果我将 std::list::iterator 更改为 std::list::const_iterator 会得到什么。

4

2 回答 2

2

您的情况有点令人困惑,因为有两个间接级别(迭代器和智能指针),以const某种方式适用于它们中的任何一个(以及引用的对象)。

您可以申请const

  • 对象本身;这意味着它不能被修改;
  • 到智能指针;这意味着智能指针不能被修改,例如不能通过reset;
  • 在某种意义上对迭代器来说,使用 a const_iterator; 这意味着它将产生const对它所引用的对象的引用(=> 智能指针),并且它不能用于修改它所引用的序列。

稍微扩展一下:

请记住, a const shared_ptr<const ClassA>&(通过取消引用 a 得到const_iterator)与 a shared_ptr<const ClassA>&(从 normal 得到)不同:尽管在两者上都不能修改指向的对象(由于引用 aiterator的事实),但在你不能修改自身,这意味着你不能让它指向另一个对象,你不能给它分配另一个对象,......shared_ptrconst ClassAconstshared_ptrresetshared_ptr

还要记住const,迭代器的版本,除了产生const对它们所指内容的引用之外,还不允许通过它们修改容器(例如,您erase不能通过 a 来修改元素const_iterator)。

于 2011-12-26T16:12:23.157 回答
0

不确定您是否理解void oper() constin 的class ClassA含义:特别是,这意味着ClassA::oper()不允许修改ClassA.

这对您选择迭代器或 const_iterator 几乎没有影响,该选择会产生不同的含义。

于 2011-12-26T16:25:56.287 回答