特定的重载转换运算符

时间:2014-10-14 16:03:05

标签: c++

我正盯着以下代码段,尝试了解正在发生的事情,或者至少如何命名我所看到的谷歌搜索结果。

struct A {
    A *m_ptr; 
    typedef A * (A::*T);
    operator T() const {
        return &A::m_ptr;
    }
};

我发现operator T()是一个重载的转换运算符,用于键入T,而类型T是一个表示A*(A::*)的typedef。现在,

  • 究竟是什么A::*
  • 它与A*之间的区别是什么?
  • A::声明中return的含义是什么?

2 个答案:

答案 0 :(得分:3)

  

到底是什么A::*

它指向A成员的指针。类型类型A* (A::*)是指向A类型的A*成员的指针。

  

它与A*之间的区别是什么?

它是指向A类型对象的指针。

  

返回语句中的A::有什么意义呢?

&(A::m_ptr)是指向对象的m_ptr成员的指针。


一个示例程序,可以更多地探讨这个想法:

#include <iostream>

struct A {
    A *m_ptr1; 
    A *m_ptr2; 
    typedef A * (A::*T);
    operator T() const {
        return &A::m_ptr1;
    }

    A(int d) : data(d) {}
    int data;
};

int main()
{
   A::T ap1 = &A::m_ptr1;
   A::T ap2 = &A::m_ptr2;

   A a1(10);
   A a2(20);

   a1.*ap1 = &a1; // a1.m_ptr1 points to a1.
   a1.*ap2 = &a2; // a1.m_ptr2 points to a2.

   a2.*ap1 = &a2; // a2.m_ptr1 points to a2.
   a2.*ap2 = &a1; // a2.m_ptr2 points to a1.

   std::cout << "a1.data: " << a1.data << std::endl;
   std::cout << "a1.m_ptr1->data: " << a1.m_ptr1->data << std::endl;
   std::cout << "a1.m_ptr2->data: " << a1.m_ptr2->data << std::endl;

   std::cout << "a2.data: " << a2.data << std::endl;
   std::cout << "a2.m_ptr1->data: " << a2.m_ptr1->data << std::endl;
   std::cout << "a2.m_ptr2->data: " << a2.m_ptr2->data << std::endl;
}

输出:

a1.data: 10
a1.m_ptr1->data: 10
a1.m_ptr2->data: 20
a2.data: 20
a2.m_ptr1->data: 20
a2.m_ptr2->data: 10

答案 1 :(得分:1)

  

它与A*之间的区别是什么?

X*X对象的地址,而X Y::*是指向成员的指针,指向类型为{{1}的类Y的成员}}

区别在于指针是对象的地址。

指向成员的指针更像是偏移量,因为它不是实际地址,而是相对于某个对象。它告诉你如何给一个成员一些对象。你不能自己取消引用指向成员的指针,你必须将它与一个对象组合以取消引用它。

您可以使用限定ID上的X运算符创建指向成员的指针,因此&表示&#34;获取对象的地址&x&# 34;但x表示获取类&Y::x的成员x的指向成员的指针。

通过使用Y运算符(或.*运算符)将对象与对象(或指向对象的指针)组合,取消引用指向成员的指针。

e.g。

->*