CB *_*ley 30

就在这里.它是指向成员的操作符,用于指向成员类型的指针.

例如

struct A
{
    int a;
    int b;
};

int main()
{
    A obj;
    int A::* ptr_to_memb = &A::b;

    obj.*ptr_to_memb = 5;

    ptr_to_memb = &A::a;

    obj.*ptr_to_memb = 7;

    // Both members of obj are now assigned
}
Run Code Online (Sandbox Code Playgroud)

这里A是一个结构,ptr_to_memb是指向int成员的指针A.该.*联合收割机的A实例的指针构件,以形成左值表达式参照给定的适当构件A实例obj.

指向成员的指针可以指向数据成员或函数成员,甚至可以为虚函数成员"做正确的事".

例如这个程序输出 f(d) = 1

struct Base
{
    virtual int DoSomething()
    {
        return 0;
    }
};

int f(Base& b)
{
    int (Base::*f)() = &Base::DoSomething;
    return (b.*f)();
}

struct Derived : Base
{
    virtual int DoSomething()
    {
        return 1;
    }
};

#include <iostream>
#include <ostream>

int main()
{
    Derived d;
    std::cout << "f(d) = " << f(d) << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


GMa*_*ckG 13

使用成员指针时,您可能会遇到该运算符:

struct foo
{
    void bar(void);
};

typedef void (foo::*func_ptr)(void);

func_ptr fptr = &foo::bar;
foo f;

(f.*fptr)(); // call
Run Code Online (Sandbox Code Playgroud)

还有相关的是->*运营商:

func_ptr fptr = &foo::bar;
foo f;
foo* fp = &f;

(fp->*fptr)(); // call
Run Code Online (Sandbox Code Playgroud)

  • 它不是一个组合——它实际上是一个单一的操作符(根据标准的§§ 2.12、5.5)。FWIW,“-&gt;*”也是单个运算符(相同的引用)。 (2认同)