我在一段时间后再次学习C++,并且有一个理解const
引用作为返回值的问题。所以这是我的了:一类,Foo
,其持有std::list
作为成员:作为返回值的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,这是罚款。现在我想找回这个名单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
现在,这令我感到奇怪和利兹我两个问题:
- 由于第二
cout
回报3一遍,致电clear()
显然不会修改原来的foo.mList
对象。但是,如果我返回了一个参考文献,为什么会这样呢?退货时是否有复印件? - 如果我收到
const
(!)引用,为什么我首先允许拨打l.clear()
?
您需要声明l变量作为参考。否则,它只是一个副本。 –
'std :: list l = foo.getList();'创建列表的副本。 'const std :: list &l = foo.getList();'获取列表的const引用。 –
zneak