【发布时间】:2012-01-26 09:08:34
【问题描述】:
如果重载解引用运算符 (operator*),成员选择运算符 (operator->) 是使用重载运算符还是需要重载它?
【问题讨论】:
标签: c++ pointers operator-overloading
如果重载解引用运算符 (operator*),成员选择运算符 (operator->) 是使用重载运算符还是需要重载它?
【问题讨论】:
标签: c++ pointers operator-overloading
您需要单独重载箭头运算符。更一般地说,即使 C++ 中相关运算符之间存在良好的映射关系,如果重载一个运算符,您也不会“免费”重载其余运算符,而必须自己实现它们。
也就是说,在解除引用方面很容易实现箭头:
T* Class::operator -> () const {
return &**this;
}
这通过取消引用this 来获取对接收者对象的引用,然后取消引用以调用operator *,然后获取返回引用的地址以获取指向应该应用箭头的对象的指针。
您可能想查看Boost.Operators 库,它可以从一小组基本操作中自动定义许多逻辑相关的运算符。
希望对你有帮助!
【讨论】:
operator*,比如operator->:return *(this->operator->());。 C++ 没有说你“应该”根据另一个实现哪个,或者费心查看你已经完成了哪个,然后为另一个提供默认值。与其他运算符类似,有不止一种方法可以做到这一点:用operator-= 实现二进制operator-,或者用一元operator- 和二进制operator+ 实现? C++ 不会告诉您“基本操作”是什么,也不会尝试弄清楚您认为它们是什么。它是一致的,如果没有帮助的话。
你基本上可以实现一个重载的解引用操作符,但是你必须引用它两次才能让你的重载操作符发挥作用!
【讨论】:
5.2.5 “如果 E1 的类型为“指向类 X 的指针”,则表达式 E1->E2 将转换为等效形式 (*(E1)).E2”。问题在于,在您的情况下,E1 不是指针。
【讨论】: