我了解正常的运算符重载。编译器可以将它们直接翻译为方法调用。我不太清楚 -> 运算符。我正在编写我的第一个自定义迭代器,我觉得需要 -> 运算符。我看了一下stl源代码并实现了我自己的:
MyClass* MyClassIterator::operator->() const
{
//m_iterator is a map<int, MyClass>::iterator in my code.
return &(m_iterator->second);
}
然后我可以使用 MyClassIterator 的实例,例如:
myClassIterator->APublicMethodInMyClass().
看起来编译器在这里做了两个步骤。
1. 调用 ->() 方法获取临时 MyClass* 变量。
2. 使用其 -> 运算符对临时变量调用 APublicMethodInMyClass。
我的理解正确吗?
The operator->
该语言具有特殊的语义,当重载时,它会将自身重新应用于结果。虽然其余运算符仅应用一次,operator->
编译器将根据需要多次应用以获得原始指针,并再次访问该指针引用的内存。
struct A { void foo(); };
struct B { A* operator->(); };
struct C { B operator->(); };
struct D { C operator->(); };
int main() {
D d;
d->foo();
}
在前面的示例中,在表达式中d->foo()
编译器将获取该对象d
并申请operator->
到它,这会产生一个类型的对象C
,然后它将重新应用该运算符来获取一个实例B
,重新申请并到达A*
,之后它将取消引用该对象并获取指向的数据。
d->foo();
// expands to:
// (*d.operator->().operator->().operator->()).foo();
// D C B A*
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)