指向C++中数据成员的指针的值
the value of pointer to data member in C++
遇到一个非常奇怪的问题,有人知道这是什么原因吗?该代码在Visual Studio 2012下进行了测试。
#include <iostream>
struct A {
int a;
};
struct B {
int b;
};
struct C : public A, public B {
int c;
};
int main() {
int C::*p = &C::b;
std::printf("%pn", &C::b); //00000000
std::printf("%pn", p); //00000004
return 0;
}
指向成员的指针不仅仅是普通的C指针,因此将它们传递给printf
实际上是未定义的行为,因为printf
将相信"%p"
,并将指向成员的指示器C型转换为void*
。
第4.11段列出了标准允许的指向成员的指针的唯一转换:
- Null指针常量可以转换为Null成员指针值
- 如果B是D的可访问、非歧义和非虚拟基类,则
B::*T
可以转换为D::*T
指向成员的指针实际上可以有不同的大小,这取决于它们指向的类。
有关MSVC中指向成员实现的指针的更多信息,请参阅此处:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/09/70002.aspx
注意可能出现的意外结果
printf("typeid(&C::b) = %sn",typeid(&C::b).name());
printf("typeid(&B::b) = %sn",typeid(&B::b).name());
VS2010收益率:
typeid(&C::b) = int B::*
typeid(&B::b) = int B::*
这表明&C: :b是类型b上的成员指针。由于C是从b派生的,指针可以自由转换为类型C上的成员指示器。这解释了您看到的两个值之间的差异&C: :b是类型b上的成员函数指针,int C::*p是类型C上的成员功能指针。
int B::*p_b = &B::b;
int C::*p_c = p_b;
printf("p_b = %pn", p_b);
printf("p_c = %pn", p_c);
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 共享 C++ 的数据成员指针
- C++数据成员:值与指针
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 如何在C++中使用类对象访问指针数据成员
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- 通过指针算法访问结构数据成员
- 如何强制实施有关指针数据成员的常量正确性
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 检查课程是否具有指针数据成员
- 处理类的指针数据成员的动态内存
- 在堆上启动的指针数据成员
- 运算符重载与 C++ : 具有指针数据成员的类
- 我是否需要清理非指针数据成员
- 在堆或堆栈上的指针类实例中分配C++非指针数据成员
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 从Cocos2d::Layer派生的类有一个指针数据成员.这个元素也有一个向量容器.调用vector::push_bac
- 移动非指针数据成员的语义
- c++:指针数据成员在类继承层次结构中的行为