c ++ stl const iterator和const指针

时间:2011-12-26 16:08:36

标签: c++ const shared-ptr const-iterator

我对这个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将会得到什么。

2 个答案:

答案 0 :(得分:2)

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

您可以申请const

  • 到物体本身;这意味着它无法修改;
  • 到智能指针;这意味着不能修改智能指针,例如无法通过reset;
  • 重新设置
  • 在某种意义上说是迭代器,使用const_iterator;这意味着它将对它引用的对象(=&gt;智能指针)产生const引用,并且它不能用于修改它引用的序列。

扩大一点:

请注意,const shared_ptr<const ClassA>&(取消引用const_iterator后获得的)与shared_ptr<const ClassA>&(您从普通iterator获得的)不同:虽然在两者上你都无法修改指向的对象(由于shared_ptr引用const ClassA这一事实),在const上你无法修改shared_ptr本身,例如表示您无法reset指向另一个对象,您无法为其指定另一个shared_ptr,...

还要记住const版本的迭代器,除了对它们引用的内容产生const之外,还禁止通过它们修改容器(例如,你不能erase通过一个元素const_iterator {{1}})。

答案 1 :(得分:0)

不确定您是否理解void oper() constclass ClassA的含义:特别是,它意味着ClassA::oper()不允许修改ClassA的任何成员。

对于你选择的迭代器或const_iterator几乎没什么影响,这个选择会有不同的含义。