运算符 [] 重载

Operator [] overloading

提问人:Luchian Grigore 提问时间:8/2/2011 最后编辑:Luchian Grigore 更新时间:8/2/2011 访问量:274

问:

我有以下代码:

class A
{
    public:
    A() {};
    void operator[](int x)
    {
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    a.operator[](0);
    a[0];
}

这两个电话都有效,但我想知道是否有任何区别。一个比另一个更有效率吗?在这两种情况下,是否会发生其他事情(除了在重载运算符中执行代码)?

编辑: 有没有一种情况,为什么你想写一个运算符,而不仅仅是[]。如果不使用短语法,重载有什么意义?

C++语言

评论

0赞 Clement Bellot 8/2/2011
在一种情况下,您明确表示存在运算符重载,在另一种情况下,没有,但它不那么冗长。但在编译的代码中,这是完全相同的。

答:

5赞 Kerrek SB 8/2/2011 #1

两个调用是相同的。所有运算符都可以使用显式语法调用,其中代表实际运算符符号。.operator####

当涉及到类时,像这样的文字运算符只是句法糖。(当然,对于原始类型来说,情况并非如此。a + ba.operator+(b)

请注意,你的 [] 运算符不是很典型,因为它通常用于返回对某物的引用——但这取决于你如何实现它。但是,您仅限于一个参数,这与 .operator()

2赞 foxy 8/2/2011 #2

除了必须再键入 11 个字符外,两者之间没有功能上的区别。

1赞 sharptooth 8/2/2011 #3

它们是完全等价的 - 只是有一次 C++ 添加了语法糖,使你的代码更漂亮。您可以显式调用所有重载运算符 - 效果将与隐式调用它们并且编译器将调用重定向到它们时相同。

1赞 iammilind 8/2/2011 #4

不,从性能的角度来看,两个版本之间没有区别。 更具可读性。a[0]

此外,通常定义为,operator []

Type& operator[](const int x)
{
  return v[x];  // Type 'v' is member variable which you are accessing for array
}

评论

0赞 foxy 8/2/2011
如果没有预期的返回值(和类型),则此答案将不相关。
0赞 iammilind 8/2/2011
@freedompeace,通常需要返回值。否则,我们不能做,.a[0] = a[1] = a[2] = ...;
2赞 Alok Save 8/2/2011
@freedompeace:有了这个,我看不出有任何理由投反对票。+1 补偿糟糕的反对票。typically
0赞 iammilind 8/2/2011
@Als,“选择性否决”在 SO 中是一个无法追踪的问题;我面临了一段时间。情况可能是这样,也可能不是这样。无论如何,感谢您的支持。
1赞 foxy 8/2/2011
@iammilind,我对你有感觉。我也明白。
4赞 Seb Holzapfel 8/2/2011 #5

显式(以及任何其他显式运算符)用于继承层次结构,在继承层次结构中,您正在尝试调用基类。你不能使用普通的 来做到这一点,因为它会导致递归函数调用。即;您可以使用如下所示的内容:operator[]operator[][]

struct Base {
    void operator[] (int i) { }
};

struct Derived : public Base {
    void operator[] (int i) 
        { Base::operator[](i); }
};