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,我同情你。我也明白。