2015-03-03 60 views
0

我有2重載運算符聲明,我需要幫助理解。C++過載映射[]運算符

template<class KEY, class T> 
const T& Map<KEY, T>::operator [](const KEY& key) const { } 

template<class KEY, class T> 
T& Map<KEY, T>::operator [](const KEY& key) { } 

第一[]用於訪問的值/返回值,即std::cout<<m["x"]<<std::endl;

第二[]是用於分配,即m["x"] = 1;

問題我屬於第二[]。如果我要做m["z"] = 1010如何作爲與密鑰z相關的值存儲?看看函數聲明,我只看到了鍵,而不是值。

我試過m_value = T();,但我不確定T()是什麼。

謝謝

+1

你問m [「z」] = 10如何在幕後工作? – 2015-03-03 11:00:20

+0

當'm'不是const時,'std :: cout << m [「x」] << std :: endl;'使用非const(2nd)版本。 – alain 2015-03-03 11:05:40

+0

第二個(你稱之爲「用於賦值」)的運算符只能應用於非常量Map對象。結果是對值類型T的非常量引用。 在此非常量T上,現在可以應用T :: operator =(const T&tparm):這意味着T的賦值運算符用於將tparm分配給T&你從第二個操作員處獲得。 – 2015-03-03 11:14:13

回答

1

該函數返回一個參考:

template<class KEY, class T> 
T& Map<KEY, T>::operator [](const KEY& key) { } 
^ that means "reference" 

這將是存儲在地圖的對象的引用。分配給參考將分配給該對象。

0

區別在於const。理論上你也可以使用第二個輸出(也可以這樣做,因爲它們基本上都是相同的參數,但這不是你的問題:)

你的第二個「[]」正在做的是給您可以訪問存儲在「z」處的項目,該分配是使用「=」運算符完成的,該運算符在此處未顯示爲過載。

因此,10使用標準版本的「=」運算符使用第二個「[]」運算符作爲訪問方法進行存儲。

希望這會有幫助

+0

不是'在理論上',但是隻要地圖不是常量。 – alain 2015-03-03 11:08:42

+0

不錯,謝謝你的正確。 – Malekai 2015-03-03 11:09:33

+0

提供的overloaded =無用,因爲它用於將一個地圖複製到另一個地圖。回到上面提到的參考「&」,我仍然不太確定如何使用它。我發現了一個例子,其中有人沿着'map [length + 1] = pair(KEY,T>(key,T())的方法做了一些事情;'你會知道'T()'服務的目的是什麼嗎?「 – Steven 2015-03-03 11:16:52