我的问题是:
之间的区别const T& operator[](const int nIndex) const;
和
T& operator[](const int nIndex);
为什么我需要在课堂上定义它们,目的是什么?后者不会足够吗?
答案 0 :(得分:15)
在其末尾带有const
的成员函数声明允许甚至在const
对象上调用该函数。这仅适用于不修改对象状态的成员函数。
假设您重载这些运算符的类称为X
。据推测,它的行为有点像容器,通过operator[]
可以访问它包含的元素。
现在假设用户想要使用const X
:
const X x = /* fill it */;
use(x[0]);
是否允许用户这样做?大概。如果他们想要一个不可变的容器,那就让他们拥有它。如果您未提供const
版operator[]
,则他们将无法执行此操作。他们毕竟不是试图修改容器,他们只是看着它的内容。
现在为什么const
operator[]
版本的const
会返回const
引用?因为它必须。它返回对类本身成员的引用。如果容器为const
并返回非const X x = /* fill it */;
x[0].modify();
引用,则调用者只需使用此运算符即可修改其内部:
x
哦亲爱的,我们修改了const
的状态,即使它是{{1}}。这可能很糟糕,事实上,编译器甚至不会让你这样做。
答案 1 :(得分:3)
这些是类的成员函数,将根据该类是否用作const
上下文来选择版本。
在[]
上下文中的对象上使用const
时,将调用此版本。它保留了返回元素的const
- 。
const T& operator[](const int nIndex) const;
在非[]
对象上使用const
时,将调用此版本。它指定当您的对象不是const
时,您将获得一个可以修改的元素,允许使用myObject[0] = 10;
等代码
T& operator[](const int nIndex);
答案 2 :(得分:2)
如果您要访问的对象是const
,则您不希望能够修改它。编译器不允许您调用函数的非const
版本。
const vector<int> mints;
mints[3] = 5; // not allowed by compiler
答案 3 :(得分:2)
第一个
const T&amp; operator [](const int nIndex)const;
是一个常量方法(函数),即它保证它不会改变任何类成员变量(除非它是可变的)。
它还返回一个常量对象,这意味着你只能调用常量函数,即你只能调用末尾的const类似于上面的函数。
T&安培; operator [](const int nIndex);
此方法可能会更改成员变量并返回一个可以调用任何类方法的对象。
我们需要它们,因为常量对象将使用常量方法而非常量将使用另一个。