C运算子-> *和。*

C++ operator ->* and .*

本问题已经有最佳答案,请猛点这里访问。

早上好,

我遇到了这个问题,但是我对Wikipedia上列出的"成员指向的对象..."类型运算符特别感兴趣。

我从来没有在实际代码的上下文中看到过这个,所以这个概念对我来说似乎有些深奥。

我的直觉说应该按如下方式使用它们:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct A
{
    int *p;
};

int main()
{
    {
        A *a = new A();
        a->p = new int(0);
        // if this did compile, how would it be different from *a->p=5; ??
        a->*p = 5;
    }

    {
        A a;
        a.p = new int(0);
        // if this did compile, how would it be different from *a.p=5; ??
        a.*p = 5;
    }

    return 0;
}

但这不会编译,因为未声明p。 (请参见示例)

任何人都可以提供在C语言中使用operator-> *和/或。*的真实示例吗?


这些运算符用于指向成员对象的指针。您不会经常遇到他们。例如,它们可用于指定对A对象进行操作的给定算法要使用的函数或成员数据。

基本语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>

struct A
{
    int i;
    int geti() {return i;}
    A():i{3}{}
};

int main()
{
    {
        A a;
        int A::*ai_ptr = &A::i; //pointer to member data
        std::cout << a.*ai_ptr; //access through p-t-m
    }

    {
        A* a = new A{};
        int (A::*ai_func)() = &A::geti; //pointer to member function
        std::cout << (a->*ai_func)(); //access through p-t-m-f
    }

    return 0;
}


->*.*语法是"指针到成员"运算符,可用于存储指向非常特定对象的成员的指针。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
12
class A {
    public: int x;
};

int main() {
    A obj;
    int A::* memberPointer = &A::b;  //Pointer to b, which is int, which is member of A
    obj.*memberPointer = 42; //Set the value via an object

    A *objPtr = &obj;
    objPtr->*memberPointer = 21;  //Set the value via an object pointer
}