私はしばらくしてからC++を習得しており、戻り値としてconst
の参照を理解する問題があります。メンバーとしてstd::list
を保持しているクラス、Foo
を、::だから、ここで私が持っているものである戻り値としてのconst参照はC++でどのように機能するのですか
class Foo
{
std::list<int> mList;
Foo() { mList.insert(mList.end(), { 1, 2, 3 }); }
size_t size() const { return mList.size(); }
};
は、クラスFoo
からfoo
オブジェクトを作成し、細かいfoo.size()
戻り3を呼び出します。今、私は2つの要件を、このリストmList
を取得したい:
- 私は、呼び出し元が元のリストを変更できるようにする必要はありません。
- リストを取得するときに各リストメンバーのコピーを作成したくありません。
この話題を少し読んだ後、私はconst
のリストへの参照を返すことにしました。したがって、私はFoo
に次のメソッドを追加しました:
const std::list<int>& getList() const { return mList; }
を私は期待私はこのリストの中に、元のデータにアクセスできるように、これは、リストmList
への参照を返すというものでした。しかし、それはconst
の参照であるため、返されたリスト/参照を変更することもできないと予想しました。
Foo foo;
cout << foo.size() << endl; // returns 3
std::list<int> l = foo.getList();
l.clear();
cout << foo.size() << endl; // returns 3 again
は今、この2つの質問に、私とリーズ私を驚か:再び第二cout
戻り3以来
- 、
しかし、このビットで遊んで私は、次のを発見しました
clear()
への呼び出しは、明らかに元のfoo.mList
オブジェクトを変更しません。しかし、なぜ私は参照を返した場合、その場合ですか?帰りの間にコピーが起こっていますか? const
(!)のリファレンスを受け取った場合、最初にl.clear()
に電話することが許可されるのはなぜですか?あなたがstd::list<int> l = foo.getList();
を行うと、あなたが返された参照を(getList()
がconst
参照を返す場合でも、あなたがしたい場合は、それをコピーすることは禁じられていない)コピーして、新しいリストl
を作成
l変数を参照として宣言する必要があります。それ以外の場合は単なるコピーです。 –
'std :: list l = foo.getList();'リストのコピーを作成します。 'const std :: list &l = foo.getList();'はリストへのconst参照を取得します。 –
zneak