3

我目前正在为我的一个类使用 C++ 中的动态内存编写一个双链表。我已经写好了代码,我只是有一个问题。

我们的教授要求我们写两个

int& operator[](int position) 

int operator[](int position) const

功能。

为同一个运算符执行两个函数有什么意义?我敢肯定这背后有某种逻辑,哈哈。是不是我可以做 a = arr[i] 也可以做 arr[i] = a?

4

6 回答 6

4

如果您有一个const列表对象,您应该只能从中读取值。如果你有一个可修改的,你应该能够读取和写入值。第一个是使用const版本完成的,它将为一个const对象调用。

于 2013-09-25T20:54:54.400 回答
1

当您的对象是 const 时,您只能使用const运算符的版本,由于是 const,它不允许修改您的对象或返回对内部成员的非 cons 指针/引用。因此,当您的对象是非常量时,您需要一个允许修改的非常量运算符,以便您可以编写foo[i]=n

于 2013-09-25T20:59:53.977 回答
0

是不是我能做a = arr[i]也能做arr[i] = a

是的,这就是它的用途。

  • 如果您有一个const或一个非const列表,那么您可以执行a = arr[i]任务;
  • 返回 an 的运算符版本int&是这样您就可以执行arr[i] = a,这当然需要一个非const列表。
于 2013-09-25T20:52:40.927 回答
0

1)const变量用于读取,例如当您为变量赋值时。尝试修改指定索引处的列表值时,编译器会给您一个错误。const 的示例a = arr[i]如您所写。

2)non-const variant通常在您实际设置列表的某个索引处的值时使用。尽管您也可以使用此变体来获取值。但是,当您的意图只是读取并且您的代码会意外写入时,编译器不会引发错误。这可能会导致细微的错误,您可以通过const在这种情况下使用这些错误来避免这些错误。非常量的示例arr[i] = a如您所写。

如果您同时存在两个版本,则在对非常量对象执行索引时,将调用非常量版本版本以供读取。

于 2013-09-25T20:53:04.070 回答
0

只是如果你有一个对象的 const 变量,让我们调用它,A const a;那么你只能调用 const 函数,比如你的 const 重载operator [] (...) const,它只提供读取。operator [] (...)在这种情况下,您不能调用非常量。

于 2013-09-25T21:04:30.760 回答
0

如果您有一个使用限定符定义的双向链表对象const(通常称为“const 对象”)或通过指向 const 的指针或指向 const 的引用来引用,您希望启用读取但不写作。const-qualified 运算符执行此操作。

如果您有一个没有限定符定义的对象const,或者通过指向非 const 的指针或指向非 const 的引用来引用,则您希望同时启用读取和写入。不合格的const操作员会这样做。

因此,您费心编写两个重载的原因是实现这两种行为。

如果您只想阅读,而不考虑 constness,那么您只会编写const版本,因为const-qualified 成员函数可以用于与这两种情况进行交互,而 non const-qualified 成员函数只能用于 non-qualified 的const名称对象(或通过指向非 const 的指针或指向非 const 的引用)。

如果您只想operator[]应用于非const对象,那么您将只编写非const限定版本。这可能看起来很奇怪,因为您不希望对象是可修改的,但碰巧这operator[]正是.std::mapoperator[]

于 2013-09-25T22:09:30.770 回答