为什么需要重载[]运算符?我从来没有遇到过必要的实际场景。有人可以告诉我一个实际的用例。
答案 0 :(得分:8)
错误.. std::vector<t>
,std::basic_string<t>
,std::map<k, v>
和std::deque<t>
?
我将此用于表示注册表项的类,其中operator[]
返回一个表示注册表值的对象,其中包含[] s之间的字符串。
另请参阅Spirit Parser Framework,它使用[]进行语义操作。
答案 1 :(得分:4)
任何可索引容器都可以有用地定义operator[]
,以便在使用[]
的任何模板中使用 - 语法索引。
如果你没有进行通用编程,你就不会需要语法糖 - 它可能看起来很好,但是,除了化妆品,你总是可以定义特定的命名方法,例如getAt
,setAt
等,具有类似且更简单的代码功能。
然而,泛型编程是现代C ++的核心......它与“编译时,类型安全的鸭子打字”有一种怪异的相似之处(我当然偏向于这种特殊的术语,当然,有过塑造它的一部分 - cfr wikipedia; - )。
正如您应该尝试使用前缀 - *
来表示所有类型的迭代器和其他类似指针类型的“解除引用”(因此它们可以用鸭子类型代替模板中的指针) !),所以你应该努力在有意义的容器类型中定义operator[]
,这样它们就可以在适当的模板中用鸭子代替数组。
答案 2 :(得分:3)
如果您实现几乎任何类型的容器,它可以为其元素提供随机访问(或至少某种形式的键控访问),这很有用(例如,考虑std::vector
)。
答案 3 :(得分:1)
如果编写一个继承自另一个实现[]运算符的类的类,则可能需要覆盖[]运算符,例如std::vector
或std::string
。如果你不这样做,你的类可能无法按用户的期望工作,因为你的类将隐式继承父的[]实现。
答案 4 :(得分:1)
好吧,几个STL容器给出了一些例子 - vector<>
重载它使它像一个数组一样行动。例如map<>
提供operator[]
重载以提供'关联数组'。
答案 5 :(得分:1)
虽然它不是绝对必要的,但在使用户定义的容器或字符串表现得像内置数组或C字符串时非常有用。这大大减少了冗长(例如,在Java中,你必须使用x.getElementAt(i)而在C ++中你可以使用x [i];类似地,在Java中你需要x.compareTo(y)&lt; 0,在C ++中,您可以使用x&lt; y)实现相同的功能。这是语法糖......但它非常非常好吃。