[]运算符的运算符重载

时间:2010-04-27 04:24:21

标签: c++ operator-overloading

为什么需要重载[]运算符?我从来没有遇到过必要的实际场景。有人可以告诉我一个实际的用例。

6 个答案:

答案 0 :(得分:8)

错误.. std::vector<t>std::basic_string<t>std::map<k, v>std::deque<t>

我将此用于表示注册表项的类,其中operator[]返回一个表示注册表值的对象,其中包含[] s之间的字符串。

另请参阅Spirit Parser Framework,它使用[]进行语义操作。

答案 1 :(得分:4)

任何可索引容器都可以有用地定义operator[],以便在使用[]的任何模板中使用 - 语法索引。

如果你没有进行通用编程,你就不会需要语法糖 - 它可能看起来很好,但是,除了化妆品,你总是可以定义特定的命名方法,例如getAtsetAt等,具有类似且更简单的代码功能。

然而,泛型编程是现代C ++的核心......它与“编译时,类型安全的鸭子打字”有一种怪异的相似之处(我当然偏向于这种特殊的术语,当然,有过塑造它的一部分 - cfr wikipedia; - )。

正如您应该尝试使用前缀 - *来表示所有类型的迭代器和其他类似指针类型的“解除引用”(因此它们可以用鸭子类型代替模板中的指针) !),所以你应该努力在有意义的容器类型中定义operator[],这样它们就可以在适当的模板中用鸭子代替数组。

答案 2 :(得分:3)

如果您实现几乎任何类型的容器,它可以为其元素提供随机访问(或至少某种形式的键控访问),这很有用(例如,考虑std::vector)。

答案 3 :(得分:1)

如果编写一个继承自另一个实现[]运算符的类的类,则可能需要覆盖[]运算符,例如std::vectorstd::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)实现相同的功能。这是语法糖......但它非常非常好吃。