1

この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に変更した場合に何が得られるか想像できません。

4

2 に答える 2

2

const2 つのレベルの間接化 (反復子とスマート ポインター)があり、それらのいずれにも (および参照されるオブジェクトにも) 何らかの方法で適用できるため、状況は少し混乱します。

適用できますconst

  • オブジェクト自体に。これは、変更できないことを意味します。
  • スマートポインタへ; これは、スマート ポインターを変更できないことを意味しresetます。
  • const_iterator;を使用して、ある意味でイテレータに これは、それがconst参照するオブジェクト (=> スマート ポインター) への参照を生成し、それが参照するシーケンスを変更するために使用できないことを意味します。

少し拡大:

a const shared_ptr<const ClassA>&(これは a を逆参照することによって得られるものです) は a (通常の から得られるものconst_iterator) とは異なることに注意してください: どちらでも ( が a を参照するという事実のため)指されたオブジェクトを変更することはできませんが、それ自体を変更することはできません。つまり、別のオブジェクトを指すことはできず、別のオブジェクトを割り当てることはできません...shared_ptr<const ClassA>&iteratorshared_ptrconst ClassAconstshared_ptrresetshared_ptr

イテレータconstのバージョンは、constそれらが参照するものへの参照を生成するだけでなく、それらを介してコンテナを変更することも許可しないことにも注意してください (たとえばerase、 を介して要素を変更することはできませんconst_iterator)。

于 2011-12-26T16:12:23.157 に答える
0

void oper() constin の意味を理解しているかどうかわからない: 特に、が のメンバーを変更することは許可されていないことをclass ClassA意味します。ClassA::oper()ClassA

iterator または const_iterator の選択にほとんど影響を与えませんが、その選択には異なる意味があります。

于 2011-12-26T16:25:56.287 に答える