2011-12-26 114 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