C++ 如何使用指针访问运算符->;作品 #包括 使用名称空间std; 类myclass { 公众: 虚无乐趣() { cout将返回指向myclass的指针,但指针指向的myclass对象如何调用fun()

C++ 如何使用指针访问运算符->;作品 #包括 使用名称空间std; 类myclass { 公众: 虚无乐趣() { cout将返回指向myclass的指针,但指针指向的myclass对象如何调用fun(),c++,pointers,C++,Pointers,编辑:既然spointer::operator->返回一个指向myclass的指针,为什么人们可以说s->fun(),而不是说s->->->fun()或其他什么C++11标准这样说重载的操作符(13.5.6“重载/重载操作符/类成员访问”): 如果存在T::operator->(),并且重载解析机制将运算符选择为最佳匹配函数,则表达式x->m对于类型为T的类对象x解释为(x.operator->())->m 因此,成员访问操作符(->)应用于重载实现的结果(产生类似于s->->fun()的注释)

编辑:既然
spointer::operator->
返回一个指向
myclass
的指针,为什么人们可以说
s->fun()
,而不是说
s->->->fun()
或其他什么C++11标准这样说重载的
操作符(13.5.6“重载/重载操作符/类成员访问”):

如果存在
T::operator->()
,并且重载解析机制将运算符选择为最佳匹配函数,则表达式x->m对于类型为T的类对象x解释为
(x.operator->())->m


因此,成员访问操作符(
->
)应用于重载实现的结果(产生类似于
s->->fun()的注释)。这允许重载在实现智能指针或指针代理时“自然”运行。

C++11标准对重载的
->
运算符(13.5.6“重载/重载运算符/类成员访问”)作了如下说明:

如果存在
T::operator->()
,并且重载解析机制将运算符选择为最佳匹配函数,则表达式x->m对于类型为T的类对象x解释为
(x.operator->())->m


因此,成员访问操作符(
->
)应用于重载实现的结果(产生类似于
s->->fun()的注释)。这使得重载在实现智能指针或指针代理时“自然”运行。

对不起。你的问题到底是什么?@JoelCornett我猜,既然
spointer::operator->
返回指向
myclass
的指针,为什么人们可以说
s->fun()
,而不必说
s->fun())
或其他什么。我认为这是一个有效的问题。@JoelCornett juanchopanza正确地解释了它。@q126y基本答案是“它必须这样工作”,因为它的关键是允许用户定义的类型看起来像指针(至少就反引用而言)除非你需要所有额外的东西,否则不要使用
std::endl
'\n'
开始新的一行。对不起。你的问题到底是什么?@JoelCornett我猜,既然
spointer::operator->
返回了一个指向
myclass
的指针,为什么可以说
s->fun()
,而不必说
s->->fun()
或其他什么。我认为这是一个有效的问题。@JoelCornett juanchopanza,正确地解释了它。@q126y基本答案是“它必须这样工作”,因为整个要点是允许用户定义的类型看起来像指针(至少就反引用而言)除非你需要所有额外的东西,否则不要使用
std::endl
'\n'
开始一个新行。如果
operator->
返回一个类(不是指针),并且该类也有
operator->
返回一个类(不是指针),那么这也可以“级联”还有
操作符->
#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;
}