C++ 操作员有什么特别之处->;它是如何工作的? #包括 甲级 { 公众: INTA; int b; INTC; int d; }; B类 { A A; 公众: B(inta,intb,intc,intd):a{a,B,c,d}{ A*运算符->() { 回报&a; } A*运算符++(int) { 回报&a; } A*指针() { 回报&a; } }; int main() { B(1,2,3,4); //std::cout->abcd

C++ 操作员有什么特别之处->;它是如何工作的? #包括 甲级 { 公众: INTA; int b; INTC; int d; }; B类 { A A; 公众: B(inta,intb,intc,intd):a{a,B,c,d}{ A*运算符->() { 回报&a; } A*运算符++(int) { 回报&a; } A*指针() { 回报&a; } }; int main() { B(1,2,3,4); //std::cout->abcd,c++,pointers,operator-overloading,operators,C++,Pointers,Operator Overloading,Operators,是的,它是为过载而特别设计的 (强调矿山) 如果提供了一个用户定义的操作符->,那么操作符->将根据它返回的值再次递归调用,直到到达返回普通指针的操作符->为止。之后,内置语义将应用于该指针 这意味着像->a这样的成员访问最终应用于返回的指针a* 操作员->如何工作 对于指针,ptr->member是(*ptr.member的缩写 如果操作符->类重载返回指向对象的指针,则class\u object->member相当于pointer\u由\u操作符返回的\u->member,这相当于(*po

是的,它是为过载而特别设计的

(强调矿山)

如果提供了一个用户定义的操作符->,那么操作符->将根据它返回的值再次递归调用,直到到达返回普通指针的操作符->为止。之后,内置语义将应用于该指针

这意味着像
->a
这样的成员访问最终应用于返回的指针
a*

操作员->如何工作

对于指针,
ptr->member
(*ptr.member
的缩写

如果操作符->类重载返回指向对象的指针,则
class\u object->member
相当于
pointer\u由\u操作符返回的\u->member
,这相当于
(*pointer\u由\u操作符返回)。member
与上一段中的等价性相同

除了指针之外,类的操作符->重载可以返回另一个重载操作符->的类对象。在这种情况下,操作符->将递归应用,直到重载返回指针,在这种情况下,前面的段落将适用

一元运算符*和运算符->的重载是分开的,但只要运算符->返回指向与运算符*返回引用相同对象的指针,则
class\u object->member
(*class\u object)之间保持相同的行为等价性.member
-尽管它们会调用单独的运算符重载

在您的特定情况下,
b->c
相当于
b.a->c
(其中
b.a
在成员函数中被访问),因为重载运算符返回指向
this->a
的指针

这是否仅适用于运算符->


是的。

我认为宋元耀的描述更好;它涵盖了递归。但这很容易修复。替换
(*pointer\u由\u操作符返回)。成员
(class\u object.operator->())->member
。这是实际的代码等价物。@MSalters我更新了答案以涵盖返回非指针的情况。
#include <iostream>

class A
{
public:

    int a;
    int b;
    int c;
    int d;
};

class B
{
    A a;

public:

    B(int a, int b, int c, int d) : a{ a, b, c, d } {}

    A* operator->()
    {
        return &a;
    }

    A* operator++(int)
    {
        return &a;
    }

    A* pointer()
    {
        return &a;
    }
};

int main()
{
    B b(1, 2, 3, 4);

    //std::cout << b->->a << ' ' << b->->b << ' ' << b->->c << ' ' << b->->d << std::endl;

    std::cout << b->a << ' ' << b->b << ' ' << b->c << ' ' << b->d << std::endl;

//  std::cout << b.pointer()a << ' ' << b.pointer()b << ' ' 
//              << b.pointer()c << ' ' << b.pointer()d << std::endl; 

    std::cout << b.pointer()->a << ' ' << b.pointer()->b << ' ' 
                << b.pointer()->c << ' ' << b.pointer()->d << std::endl; 

    //std::cout << b++a << ' ' << b++b << ' ' << b++c << ' ' << b++d << std::endl;

    std::cout << b++->a << ' ' << b++->b << ' ' << b++->c << ' ' << b++->d << std::endl;
}