3

哪些场景可能需要重载下标运算符?

断言函数与此有什么关系?我看到在大多数下标重载使用断言的情况下,需要对此进行解释。

4

6 回答 6

7

您可能会[]在自定义容器上重载运算符,以提供一种在语法/语义上更清晰的访问元素的方式。

例如my_container[3] = 9;my_container.set(3, 9);

当然,你可以重载[]to 做任何事情,但你可能不应该这样做。例如,您可以使my_object[3]增量增加my_object3,但从语义上讲,[]运算符传达了按索引查找,并且让您的接口符合预期总是更好。

您可以使用assert快速和肮脏的边界检查;它会导致你的程序乱七八糟地死掉,这总是比引入微妙的内存损坏更可取。好处是它assert是一个可以从生产代码中编译出来的宏,这意味着您可能会在不修改代码的情况下在开发中而不是在生产中支付边界检查容器的开销。

于 2011-03-30T14:26:07.143 回答
3

您会考虑对操作(索引(按单个字段)有意义的类进行重载operator[],因为它是向量(按位置索引)集或映射(按键索引)的情况。请注意,如果有多个维度要索引哪个,使用不同的运算符 ( operator())可能有意义,因为operator[]它需要一个参数。您可能应该阅读运算符重载上的 C++FAQ lite 条目。

通常与(或任何其他运营商)assert无关。是一种在运行时确定是否满足操作的某些先决条件的方法,当您检测到某些不变量被破坏时,应该使用它来快速失败和严重失败。operator[]assert

于 2011-03-30T14:26:48.833 回答
1

好吧,我可以说,在类包含一系列元素的情况下,我对此的了解有限。以向量/字符串为例。对于断言,您可能需要查看此站点。 - 关联 -

于 2011-03-30T14:25:12.207 回答
1

Assert与索引运算符operator[] 本身完全无关

Assert 用于检查调试版本中的前提条件/不变量,因此在投入生产之前会捕获这些违规行为。

索引操作员容易出现index out of range这种情况,这可以解释为什么您似乎比其他地方更频繁地注意到它们。我基本上在每个参数化函数中至少使用一次断言,每个类使用几次(检查不变量)。

高温高压

于 2011-03-30T14:38:03.350 回答
1

operator[] 如果您正在实现作为集合的类或集合的包装器,则可能会重载。operator[]对我来说,如果操作可以在恒定或接近恒定的时间内执行,我只会重载,因为这就是数组索引的执行方式。使用它在哈希表中查找值可能是有意义的,但对链接列表没有索引。

If you are finding asserts used in implementations of operator[], it is likely to enforce that the index argument is within the range of the collections. This, IMO, is an incorrect use of assert, since assert should be used to catch internal programming errors, rather than you program being called the wrong way. An end user or client application should never see an assertion error. The other possibility is that this class is only used internally, in which case an assertion error would reveal an internal programming error, not a wrong argument passed in by a client.

于 2011-03-30T15:14:15.787 回答
0

您可能想要更改索引的范围(例如,从 1 开始索引而不是从 0 开始),或者用一维数组表示高维数组?

于 2011-03-30T14:26:15.030 回答