c ++中的点星号运算符

时间:2010-03-30 20:41:26

标签: c++

在那里,如果,它做了什么?

.*

2 个答案:

答案 0 :(得分:29)

是的,有。它是指针到成员的运算符,用于指向成员类型。

E.g。

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
}

此处,A是结构,ptr_to_memb是指向int A成员的指针。 .*A实例与指向成员的指针组合在一起,形成一个左值表达式,引用给定A实例obj的相应成员。

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

E.g。此程序输出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;
}

答案 1 :(得分:13)

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

struct foo
{
    void bar(void);
};

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

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

(f.*fptr)(); // call

->*运算符也是相关的:

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

(fp->*fptr)(); // call