我目前正在使用C ++中的动态内存为我的一个类编写双链表。我已经编写了代码,我刚才有一个问题。
我们的教授要求我们写一个
int& operator[](int position)
和
int operator[](int position) const
功能
为同一个运营商做两个功能有什么意义?哈哈,我确定它背后有某种逻辑。是这样我可以做一个= arr [i]并且也做arr [i] = a?
答案 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
所做的。