为什么需要重载[]运算符?我从来没有遇到过这种必要的实际情况。有人可以告诉我一个实际的用例。[]运算符的运算符过载
回答
ERR .. std::vector<t>
,std::basic_string<t>
,std::map<k, v>
和std::deque<t>
?
我用这个代表一个注册表项的类,其中operator[]
返回一个表示注册表值的对象,其中包含[] s之间的字符串。
另请参阅Spirit Parser Framework,它使用[]进行语义操作。
如果你实现几乎任何类型的容器,为其元素提供随机访问(或者至少某种形式的键控访问)(例如,考虑std::vector
),这很有用。
如果您编写的继承自实现[]运算符的其他类的类,则可能需要覆盖[]运算符,如std::vector
或std::string
。如果你不这样做,你的类可能不会像用户所期望的那样工作,因为你的类将隐含地继承父类的[]的实现。
好吧,几个STL容器给出了一些例子 - vector<>
重载它使它像一个数组一样。例如,map<>
提供了operator[]
重载以提供“关联数组”。
虽然它不是严格必要的,但它对于使用户定义的容器或字符串的行为类似于内置数组或C字符串非常有用。这很大程度上减少了冗长(例如,在Java中,您将不得不使用x.getElementAt(i),而在C++中您可以使用x [i];同样,在Java中,您需要x.compareTo(y)< 0 ,而在C++中,您可以使用x < y)来实现相同的功能。它是句法糖......但它非常非常好吃。
不限可转位容器可以有效地限定operator[]
成为在使用[]
-syntax索引任何模板可用。
你不需要是语法糖,如果你不这样做泛型编程 - 它可能看起来不错,但是,化妆品之余,你总是可以定义特定的命名方法,如getAt
,setAt
和类似的,具有类似和更简单的代码功能。然而,泛型编程是现代C++的核心......它与“编译时,类型安全的鸭子打字”有着惊人的相似性(当然,我偏向于这种特殊的术语,有一部分在塑造它 - cfr wikipedia ;-)。
正如你应该尝试使用的,例如,前缀*
意味着对所有类型的迭代器和其他指针类型的“解引用”(因此它们可以用鸭子型代替指针在模板中!),所以类似地,你应该努力在容器类型中定义operator[]
,这样它们才有意义,这样才能在适当的模板中用鸭子型代替数组。
- 1. 运算符重载“运算符T *()”产生比较运算符?
- 2. C++:运算符重载,运算符+
- 3. 运算符重载运算符()'
- 4. 运算符超载赋值运算符
- 5. 定时运算符+,运算符,运算符*和运算符/
- 6. 运算符过载问题
- 7. C++过载运算符[] []
- 8. C++过载运算符++
- 9. 过载+ =运算符如果+过载?
- 10. 重载运算符
- 11. 运算符重载
- 12. 重载运算符*
- 13. 运算符超载[]
- 14. *运算符重载
- 15. 重载运算符[]
- 16. 运算符超载
- 17. 重载运算符 '+ ='
- 18. 运算符==超载
- 19. 重载+运算符
- 20. 重载运算符=
- 21. 运算符重载+ =
- 22. 运算符+超载
- 23. 运算符超载
- 24. 运算符超载
- 25. 运算符重载
- 26. 重载运算符%
- 27. 重载运算符+
- 28. 重载运算符*
- 29. 重载++运算符
- 30. 运算符重载