我在一段時間後再次學習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