2017-02-26 70 views
-4

之間的區別at()和超載有什麼區別operator[ ]?除了at()提供邊界檢查並拋出異常out_of_range之外,其實現中的區別是什麼?at()和超載運算符[] C++

operator[ ]實現:

const int LIMIT =100; 
....................... 
int& operator[ ] (int n) const 

{ 
    if(n<0 || n >= LIMIT) 
    { 
     std::cout<<"Error index!"<<std::endl; 
     exit(1); 
    } 
    return arr[ n ]; 
} 

你能給實現at()的想法?

+1

'operator []'不會執行邊界檢查。爲什麼在世界上,如果存在邊界錯誤,你會退出()一個應用程序? – PaulMcKenzie

+0

@WhiZTiM不,這只是爲了你自己。想要檢查我對差異的理解。爲了完全實現'at()',我需要拋出異常嗎? –

+0

@PaulMcKenzie猜想,我應該把'扔'在我的條件 –

回答

1

Herb Sutter的書特殊的C++風格涵蓋了第1項中的這個精確主題:在應用綁定檢查時,將拋出一個異常,當[]在超出界限時執行未定義的行爲。我們可以自由選擇我們想要使用哪一種符合C++的哲學,即人們應該只爲使用什麼而付費。 at()可能會由於檢查它的性能而變得更加昂貴。

http://www.cplusplus.com/reference/vector/vector/at/

你可以看看像gcc的一個這種實現。

+0

感謝您的回答,現在對我來說很明顯。 –

+2

如果爲自己的抽象類型實現[]和at(),最好建議保持這些語義。 –

+0

會把我的努力,再次感謝一次 –