2012-08-25 95 views
1

選擇假設我設計一個String類的自己,我想重載運算符[]的功能,這裏的選擇:我應該從下面的功能

String operator[](const size_t index); 
String& operator[](const size_t index); 
const String& operator[](const size_t index) const; 

常量的任何其他組合,非常量和引用返回類型。

+6

爲什麼字符串的[]運算符會返回一個字符串? – Cubic

+0

@Cubic有些語言消除了字符串/字符的區別,並使用單字符字符串而不是單獨的字符類型。儘管如此,這並不是一個好的理由。 – delnan

回答

3

[]string的運算符返回一個字符,而不是字符串。根據具體情況,您應該實現其中一個或兩個:

const char& operator[] (size_t index) const; 
char& operator[] (size_t index); 

第一個產生的引用無法修改。如果你的字符串是不可變的,那就是你所需要的。

第二個產生一個可以修改的引用。你可以使用它來實現聰明的東西,比如修改拷貝和引用計數。

+1

你應該有兩個。 – user1071136

+0

@ user1071136如果你實現一個支持所有標準功能的字符串,那麼是的,你需要兩個。如果你想要一個不變的字符串,類似於Java,C#或Cocoa的'NSString'中的那個,那麼第一個運算符本身就足夠了。 – dasblinkenlight

+0

只是一個側面的問題。對於性能來說,返回一個const char值而不是一個const引用會更好嗎?作爲指針是x4或x8的sizeof(char)。 – ablm

1

有些人更喜歡operator[]的簽名參數類型,它們都更類似於內置運算符[](它們也支持負指數),並且還能夠檢測負值參數(如果您有一個越界檢查)。

的C++編譯器使用評估呼叫類型內置運營商[]爲ptrdiff_t,所以你有時會發現以下

char &operator[](ptrdiff_t index); 
char operator[](ptrdiff_t index) const; 

我通常只使用普通的int參數類型。

+0

這次假設返回類型是大數據類型。所以函數會是這樣的:Type&operator [](int index);和Type運算符[](int index)const;所以我在想,最好是在第二個函數中返回大數據的參考?如果不是,那將是什麼原因。 –

相關問題