提问人:Luchian Grigore 提问时间:8/2/2011 最后编辑:Luchian Grigore 更新时间:8/2/2011 访问量:274
运算符 [] 重载
Operator [] overloading
问:
我有以下代码:
class A
{
public:
A() {};
void operator[](int x)
{
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.operator[](0);
a[0];
}
这两个电话都有效,但我想知道是否有任何区别。一个比另一个更有效率吗?在这两种情况下,是否会发生其他事情(除了在重载运算符中执行代码)?
编辑: 有没有一种情况,为什么你想写一个运算符,而不仅仅是[]。如果不使用短语法,重载有什么意义?
答:
5赞
Kerrek SB
8/2/2011
#1
两个调用是相同的。所有运算符都可以使用显式语法调用,其中代表实际运算符符号。.operator##
##
当涉及到类时,像这样的文字运算符只是句法糖。(当然,对于原始类型来说,情况并非如此。a + b
a.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); }
};
上一个:在 C++ 中返回时触发事件
评论