【问题标题】:c++ stl const iterator and const pointerc++ stl const迭代器和const指针
【发布时间】:2012-01-28 01:38:24
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    不知道你是否理解class ClassA中的void oper() const是什么意思:特别是意思是ClassA::oper()不允许修改ClassA的任何成员。

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

    【讨论】:

    • 我必须使用 (*it)->oper() 因为列表持有指向对象而不是对象的智能指针。
    • 哦,我太傻了.. 是的,我现在在 for 循环中看到了,但重点仍然适用
    【解决方案2】:

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

    你可以申请const:

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

    扩大一点:

    请记住,const shared_ptr&lt;const ClassA&gt;&amp;(这是通过取消引用 const_iterator 获得的)与 shared_ptr&lt;const ClassA&gt;&amp;(您从普通的 iterator 获得)不同:尽管在两者上您都不能修改指向的对象(由于shared_ptr 指的是const ClassA),在const 上,您不能修改shared_ptr 本身,例如意味着你不能reset它指向另一个对象,你不能分配另一个shared_ptr给它,...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多