为什么运算符过载有两个函数?

时间:2013-09-25 20:50:15

标签: c++ operator-overloading pass-by-reference

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

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

int& operator[](int position) 

int operator[](int position) const

功能

为同一个运营商做两个功能有什么意义?哈哈,我确定它背后有某种逻辑。是这样我可以做一个= arr [i]并且也做arr [i] = a?

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  

是不是我可以a = arr[i]arr[i] = a

是的,这就是它的用途。

  • 如果您有const或非const列表,则可以执行a = arr[i]分配;
  • 返回int&的运算符的版本是为了让您可以执行arr[i] = a,这当然需要非const列表。

答案 3 :(得分:0)

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

2)当您在列表的某个索引处实际设置值时,通常会使用non-const variant。虽然您也可以使用此变体来获取值。但是,当您打算阅读并且您的代码意外写入时,编译器不会引发错误。这可能会导致细微的错误,你可以通过const来解决这些问题。你写的非const的例子是arr[i] = a

如果您同时拥有这两个版本,则在对非const对象执行索引时将调用非const版本进行读取。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果你有一个双向链表对象,用const限定符(通常称为“const对象”)定义,或者通过指向const或const-to-const引用,你希望能够阅读而不是写作。 const - 限定运算符可以做到这一点。

如果您有一个没有const限定符定义的对象,或者通过指向非const的指针或非const的引用引用,那么您希望同时启用读取和写入。非const - 限定运算符可以做到这一点。

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

如果您只想阅读,无论constness如何,那么您只会编写const版本,因为const - 合格的成员函数可用于与两种情况进行交互,而非{{1} - 限定的成员函数只能用于非const限定对象的名称(或通过指向非const的指针或非const的引用)。

如果您只希望const应用于非operator[]对象,那么您只能编写非const限定版本。这可能看起来很奇怪,因为您不希望const要求对象可以修改,但实际上这正是operator[]std::map所做的。