2011-12-26 95 views
1

我有点搞不清这个const关键字 的意思我有这样C++ STL常量迭代和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

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

你可以申请const

  • 对象本身;这意味着它不能被修改;
  • 给智能指针;这意味着智能指针不能被修改,例如,不能通过reset重新安装;
  • 在某种意义上来说迭代器,使用const_iterator;这意味着它将产生一个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参考他们参考一下旁边,也不允许通过它们修改容器(例如,通过const_iterator,您不能erase元素)。

0

不知道你是否了解void oper() constclass ClassA表示:特别是,它意味着,意思是,ClassA::oper()是不允许修改的ClassA任何成员。

对你选择的迭代器或const_iterator没有什么限制,这个选择会有不同的含义。

+0

我必须使用(* it) - > oper(),因为列表中保存着对象而不是对象的智能指针。 – 2011-12-26 16:36:26

+0

哦,傻我..我看到现在在for循环,但仍然主要点仍然适用 – 2011-12-26 16:37:36