我正盯着以下代码段,尝试了解正在发生的事情,或者至少如何命名我所看到的谷歌搜索结果。
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
的含义是什么?答案 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。
->*