我目前正在为我的一个类使用 C++ 中的动态内存编写一个双链表。我已经写好了代码,我只是有一个问题。
我们的教授要求我们写两个
int& operator[](int position)
和
int operator[](int position) const
功能。
为同一个运算符执行两个函数有什么意义?我敢肯定这背后有某种逻辑,哈哈。是不是我可以做 a = arr[i] 也可以做 arr[i] = a?
我目前正在为我的一个类使用 C++ 中的动态内存编写一个双链表。我已经写好了代码,我只是有一个问题。
我们的教授要求我们写两个
int& operator[](int position)
和
int operator[](int position) const
功能。
为同一个运算符执行两个函数有什么意义?我敢肯定这背后有某种逻辑,哈哈。是不是我可以做 a = arr[i] 也可以做 arr[i] = a?
如果您有一个const
列表对象,您应该只能从中读取值。如果你有一个可修改的,你应该能够读取和写入值。第一个是使用const
版本完成的,它将为一个const
对象调用。
当您的对象是 const 时,您只能使用const
运算符的版本,由于是 const,它不允许修改您的对象或返回对内部成员的非 cons 指针/引用。因此,当您的对象是非常量时,您需要一个允许修改的非常量运算符,以便您可以编写foo[i]=n
是不是我能做
a = arr[i]
也能做arr[i] = a
?
是的,这就是它的用途。
const
或一个非const
列表,那么您可以执行a = arr[i]
任务;int&
是这样您就可以执行arr[i] = a
,这当然需要一个非const
列表。1)const
变量用于读取,例如当您为变量赋值时。尝试修改指定索引处的列表值时,编译器会给您一个错误。const 的示例a = arr[i]
如您所写。
2)non-const variant
通常在您实际设置列表的某个索引处的值时使用。尽管您也可以使用此变体来获取值。但是,当您的意图只是读取并且您的代码会意外写入时,编译器不会引发错误。这可能会导致细微的错误,您可以通过const
在这种情况下使用这些错误来避免这些错误。非常量的示例arr[i] = a
如您所写。
如果您同时存在两个版本,则在对非常量对象执行索引时,将调用非常量版本版本以供读取。
只是如果你有一个对象的 const 变量,让我们调用它,A const a;
那么你只能调用 const 函数,比如你的 const 重载operator [] (...) const
,它只提供读取。operator [] (...)
在这种情况下,您不能调用非常量。
如果您有一个使用限定符定义的双向链表对象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::map
operator[]