开发者

dot asterisk operator in c++

开发者 https://www.devze.com 2022-12-25 07:47 出处:网络
is there, and if, what it d开发者_如何学编程oes? .* Yes, there is. It\'s the pointer-to-member operator for use with pointer-to-member types.

is there, and if, what it d开发者_如何学编程oes?

.*


Yes, there is. It's the pointer-to-member operator for use with pointer-to-member types.

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
}

Here, A is a struct and ptr_to_memb is a pointer to int member of A. The .* combines an A instance with a pointer to member to form an lvalue expression referring to the appropriate member of the given A instance obj.

Pointer to members can be pointers to data members or to function members and will even 'do the right thing' for virtual function members.

E.g. this program output 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;
}


You may come across that operator when using member pointers:

struct foo
{
    void bar(void);
};

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

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

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

Also related is the ->* operator:

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

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

精彩评论

暂无评论...
验证码 换一张
取 消