重载下标运算符[]

时间:2011-03-04 13:08:00

标签: c++ operator-overloading

为什么它需要成为类操作的成员函数,并且最好返回对私有成员的引用?

class X
{
public:

    int& operator[] (const size_t);
    const int &operator[] (const size_t) const;

private:
    static std::vector<int> data;
};

int v[] = {0, 1, 2, 3, 4, 5};
std::vector<int> X::data(v, v+6);

int& X::operator[] (const size_t index)
{
    return data[index];
}

const int& X::operator[] (const size_t index) const
{
    return data[index];
}

4 个答案:

答案 0 :(得分:3)

  • 至于为什么需要[]作为会员,您可以read this question(由您真诚地)。似乎它只是它的方式而没有真正令人信服的解释。

  • 至于为什么要返回参考? 因为您想要提供一种不仅可以读取的方式,还可以(对于非const对象)来修改数据。如果退货不是参考(或某些代理人)

    v [i] = 4;

    无效。

HTH

答案 1 :(得分:2)

它必须是根据13.5.5的成员函数:

  

operator []应该是非静态的   成员函数只有一个   参数。它实现了   下标语法

对私有成员的引用完全正常且很常见。您隐藏了类的用户的详细信息,但仍然提供了所需的功能(修改单个元素的能力)

你的data变量可能不会是静态的,除非你真的想在你班级的所有实例中分享它

答案 2 :(得分:2)

对于第一个问题,这只是他们决定必须的方式,即你做不到:

T operator[]( const X &, size_t );

作为外部功能。

是的,你很好地返回对私有成员的引用,如果允许你的用户在那里写,则为非const,否则为非const。

在你的例子中虽然数据是静态的,但如果它是它返回的来源则没有意义。

答案 3 :(得分:-1)

调用非成员operator[]的语法是什么?任何语法都会很尴尬。 operator[][]中使用了一个参数,这通常是索引或查找对象所需的某种数据。

另外,是的,返回引用是个好主意,即使它是私有成员。这正是STL向量所做的,而且我能想到的任何其他类我提供的operator[]。建议保持使用。