C++中的“*”运算符是什么?

22

C++ 仍然让我感到惊奇。今天我发现了 ->* 运算符。它可以重载,但我不知道如何调用它。我设法在我的类中重载了它,但是我不知道该怎么调用。

struct B { int a; };

struct A
{
    typedef int (A::*a_func)(void);
    B *p;
    int a,b,c;
    A() { a=0; }
    A(int bb) { b=b; c=b; }
    int operator + (int a) { return 2; }
    int operator ->* (a_func a) { return 99; }
    int operator ->* (int a) { return 94; }
    int operator * (int a) { return 2; }
    B* operator -> () { return p; }


    int ff() { return 4; }
};


void main()
{
    A a;
    A*p = &a;
    a + 2;
}

编辑:

感谢回答。为了调用重载函数,我写了如下代码:

void main()
{
    A a;
    A*p = &a;
    a + 2;
    a->a;
    A::a_func f = &A::ff;
    (&a->*f)();
    (a->*f); //this
}

不,在这种情况下你不需要调用重载运算符,而是调用内置的运算符。你的重载运算符需要一个int作为第二个参数。 - AnT stands with Russia
@AndreyT:更新结构以反映新的主函数。 - user34537
@acidzombie24:好的,现在你终于调用了重载版本。同样地,你可以像sellibitze建议的那样通过a->*42来完成,而不需要进行任何更新。 - AnT stands with Russia
3个回答

17

就像.*一样,->*与成员指针一起使用。整个C++ FAQ LITE网站的一个章节都是关于成员指针的。

#include <iostream>

struct foo {
    void bar(void) { std::cout << "foo::bar" << std::endl; }
    void baz(void) { std::cout << "foo::baz" << std::endl; }
};

int main(void) {
    foo *obj = new foo;
    void (foo::*ptr)(void);

    ptr = &foo::bar;
    (obj->*ptr)();
    ptr = &foo::baz;
    (obj->*ptr)();
    return 0;
}

11
重载运算符->*是一个二元运算符(而.*不能被重载)。它被解释为普通的二元运算符,因此在你的原始情况中,为了调用该运算符,你需要像下面这样做:

重载运算符->*是一个二元运算符(而.*不能被重载)。它被解释为普通的二元运算符,因此在你的原始情况中,为了调用该运算符,你需要像下面这样做:

A a;
B* p = a->*2; // calls A::operator->*(int)

你在Piotr的回答中所读到的适用于内置运算符,而不是您重载的运算符。您在示例中调用的也是内置运算符,而不是您重载的运算符。要调用重载的运算符,您必须像我在上面的示例中所做的那样操作。


你对Piotr的回答是正确的,但是通过它,我找到了如何调用重载运算符,就像我在编辑后的问题中展示的那样。 - user34537

1

像其他运算符一样,您也可以显式地调用它:

a.operator->*(2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接