指针访问运算符 - >如何工作?

q12*_*26y 1 c++ pointers

#include <iostream>
using namespace std;
class myclass
{

public:
    void fun()
    {
        cout<<"Having some fun"<<endl;
    }
};


class spointer
{
    myclass * mptr;
public:
    spointer(myclass * m)
    {
        mptr=m; 
    }

    myclass * operator->()
    {
        return mptr;
    }

};


int main() {
    // your code goes here

    spointer s(new myclass);

    s->fun();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

s->fun()调用时main,s->会返回指针myclass,但是如何在指针指向的对象fun()上调用myclass


编辑:因为spointer::operator->返回指针myclass,为什么可以说s->fun(),而不是说s->->fun()或什么

Mic*_*urr 6

C++ 11标准说明了重载->运算符(13.5.6"重载/重载运算符/类成员访问"):

表达式x-> m被解释为(x.operator->())->m类型为T的类对象x(如果T::operator->()存在)以及是否通过重载解析机制将运算符选为最佳匹配函数

因此,成员访问operator(->)应用于重载实现的结果(导致某些内容与您的s->->fun()注释相似).这允许过载在实现智能指针或指针代理时"自然地"操作.

  • 如果`operator->`返回一个也有`operator->`的类(不是指针),这也可以'级联' (3认同)