c ++两个版本的重载下标运算符

时间:2013-03-14 15:45:42

标签: c++ operator-overloading subscript

我的问题是:

之间的区别
const T& operator[](const int nIndex) const;

T& operator[](const int nIndex);

为什么我需要在课堂上定义它们,目的是什么?后者不会足够吗?

4 个答案:

答案 0 :(得分:15)

在其末尾带有const的成员函数声明允许甚至在const对象上调用该函数。这仅适用于不修改对象状态的成员函数。

假设您重载这些运算符的类称为X。据推测,它的行为有点像容器,通过operator[]可以访问它包含的元素。

现在假设用户想要使用const X

const X x = /* fill it */;
use(x[0]);

是否允许用户这样做?大概。如果他们想要一个不可变的容器,那就让他们拥有它。如果您未提供constoperator[],则他们将无法执行此操作。他们毕竟不是试图修改容器,他们只是看着它的内容。

现在为什么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);

此方法可能会更改成员变量并返回一个可以调用任何类方法的对象。

我们需要它们,因为常量对象将使用常量方法而非常量将使用另一个。