我对这个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将会得到什么。
答案 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() const
中class ClassA
的含义:特别是,它意味着ClassA::oper()
不允许修改ClassA
的任何成员。
对于你选择的迭代器或const_iterator几乎没什么影响,这个选择会有不同的含义。