答案 0 :(得分:3)
成员访问运算符是一个有点奇怪的生物:它意味着返回一个指针或类,其中成员访问运算符被重载。一旦到达指针,它就会访问相应的成员。重载成员访问运算符的主要用途是智能指针,例如std::shared_ptr<T>
和std::unique_ptr<T>
。没有这个操作符,你需要使用像
sp.get()->member
或
(*sp).member
而不是
sp->member
答案 1 :(得分:1)
请注意,“覆盖”和“重载”这两个术语都极具误导性。规范->
运算符访问通过指针引用的对象的成员,即X* x; x->foo;
正在通过x
访问指向的内容,这是指针类型(或者更确切地说是原始指针)。
但是,您可以在聚合类型(即“类”)中实现为非静态成员函数的operator->
会有所不同。在X* x; x->foo;
中,->
仍是规范结构运算符,无法更改。但是,在Y y; y->foo
中,->
会调用operator->
的{{1}}成员函数。这个看似很小的区别是至关重要的,因为一个运算符只能 应用于原始指针类型,另一个 可以应用于非指针类型。
这通常用于允许类型在语法上行为 - 如果它们是原始指针(具有一些语义差异),如Y
等。如果没有这种语言支持,则无法实现这一点,因为如果没有shared_ptr
允许模仿规范shared_ptr<X>
运算符,则X*
和shared_ptr<X>::operator->
无法以相同的方式使用适用于->
(但不是X*
)。
答案 2 :(得分:0)
当您对指针进行建模时,为了方便起见,您希望保持通常的语法。只需看看std :: unique_ptr和std :: shared_ptr。 :)