C++ 运算符 ->* 和 .*

标签 c++ operators dereference member-access

<分区>

你好,

我遇到了 this问题,但我对列出的“成员指向的对象...”类型运算符特别感兴趣 here在维基百科上。

我从未在实际代码的上下文中看到过这一点,因此这个概念对我来说似乎有些深奥。

我的直觉告诉他们应该按如下方式使用:

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 未声明。 (参见 example)

谁能提供一个在 C++ 中使用 operator->* 和/或 .* 的真实示例?

最佳答案

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

基本语法:

#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;
}

关于C++ 运算符 ->* 和 .*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31159151/

相关文章:

c++ - 通过 char* 缓冲区读取 int 的行为是不同的,无论它是正数还是负数

c++ - 如何将 LPCWSTR 转换为 LPWSTR

javascript - Jquery - if 语句中的运算符

perl - 包含字母字符的字符串如何在数值上等同于 Perl 中的数字?

c++ - 分配取消引用的字符指针真的不可能吗?

c++ - 用于访问 auto 成员的正确运算符 (.) 或 (->)

c++ - 将 Cpp 转换为 Rust,处理全局静态对象

c++ - QTreeWidgetItem 可编辑只允许输入数字

java - '->' 运算符在 Objective C 中代表什么?

c++ - 迭代器取消引用