C++ 运算符[]重载

C++ 运算符[]重载,c++,C++,我有以下代码: class A { public: A() {}; void operator[](int x) { } }; int _tmain(int argc, _TCHAR* argv[]) { A a; a.operator[](0); a[0]; } 两个电话都有效,但我想知道是否有任何区别。一个比另一个更有效率吗?在这两种情况下都会发生其他事情(除了在重载运算符中执行代码之外) 编辑: 是否存在这样一种情况,即为

我有以下代码:

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

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    a.operator[](0);
    a[0];
}
两个电话都有效,但我想知道是否有任何区别。一个比另一个更有效率吗?在这两种情况下都会发生其他事情(除了在重载运算符中执行代码之外)

编辑: 是否存在这样一种情况,即为什么您希望编写一个.operator而不仅仅是[]。如果不使用短语法,重载有什么意义?

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

当涉及到类时,像
a+b
这样的文本运算符只是
a.operator+(b)
的语法糖。(当然,对于基本类型,情况并非如此。)


请注意,您的[]-运算符不是很典型,因为它通常用于返回对某个对象的引用,但如何实现它取决于您。但是,与“代码>操作程序”(< /Cord>>

< P>不同),您必须限定一个参数,而不是必须另外键入11个字符,这两个字符之间没有功能上的差异。

< P>它们完全等价,只是在一次情况下,C++添加了语法糖,使代码更加美观。您可以显式调用所有重载运算符-效果与隐式调用重载运算符时相同,编译器将调用重定向到重载运算符。

否从性能角度看,两个版本之间没有差异<代码>一个[0]更具可读性

此外,
运算符[]
通常定义为:

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

显式
运算符[]
(以及任何其他显式运算符)用于继承继承继承权,您试图在基类上调用
运算符[]
。您不能使用普通的
[]
,因为这会导致递归函数调用。ie;您可以使用如下内容:

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

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

在一种情况下,您明确表示存在运算符重载,而在另一种情况下,没有重载,但不太详细。但在编译后的代码中,这是完全相同的。如果没有预期的返回值(和类型),那么这个答案将不相关。@freedompeace,返回值通常是需要的。否则,我们不能做,
a[0]=a[1]=a[2]=
@freedompeace:由于
通常是
,我看不出有任何理由投反对票+1为了补偿糟糕的否决票,“选择性否决票”在SO中是一个无法追踪的问题;我要面对一段时间。情况可能是这样,也可能不是这样。无论如何,谢谢你的支持。@iammilind,我同情你。我也明白。