8

我遇到了一个 C++ 代码,其中调用了 operator->() 之类的东西。以下是代码片段,如果有人请解释一下。

template <typename T>
bool List<T>::operator == (const List& rhs)const
{
  return (this == &rhs) || (root_.operator->() == rhs.root_.operator->());
}

请注意,root_ 是我无法获得完整代码的另一类的对象。

编辑:我刚刚浏览了代码,发现 root_ 实际上是智能指针的自定义实现。它在其中重载了 operator -> 以取消引用智能指针并获取实际指针的值。

4

4 回答 4

11

当你有一个对象时,你可以通过object.attr. 当你有一个指针时,你可以通过使用这样的操作符来访问它所指向的对象->的属性:ptr->attr

到目前为止,这是 C 中的默认行为。但是,->运算符可以被重载 - 即,像任何函数一样被覆盖。你可以为一个类定义你自己的行为,这object->意味着你想要的任何东西。但是,我不相信在这种情况下,运算符会超载。奇怪的语法是因为你不能这样做:

if lhs-> == rhs->

既然->操作符后面一定要跟一些东西。因此,这样做的方法是为这个函数使用显式的、无糖的名称,即 ,operator->并像函数一样调用它(因此有括号)。

所以:

return (this == &rhs) || (root_.operator->() == rhs.root_.operator->());

这行的意思是“如果我的对象等于左边的对象,或者如果我们的_root属性指向彼此相等的对象,则返回真。”。

于 2013-06-08T13:49:38.917 回答
4

您要问的是结构取消引用运算符T::operator ->();它来自,在中它可以被重载。

它通过指针选择一个元素,并以在您的示例中使用的方式使用它,它只返回实例的地址 ( root_)。

然后使用该地址来比较实例的身份(地址是否匹配?)

于 2013-06-08T13:52:01.487 回答
0

它是->类的运算符重载的调用。

于 2013-06-08T13:37:16.177 回答
0

通常 operator->() 返回一个指针,所以这段代码只是比较两个指针。我认为这是一个链表实现,并且 operator== 比较指向整个列表的指针和指向头(根)元素的指针

于 2013-06-08T13:40:00.237 回答