关于C++中指向数据成员的指针的一些混淆
Some confusions about pointers to data-member in C++
class Foo {
public:
int a = 1;
int b = 2;
};
int main() {
Foo foo;
cout << &Foo::a << endl;//output 1
cout << &Foo::b << endl;//also output 1
}
正如我们所知,指向成员数据的指针应该指出与对象起始地址的相对偏移量,但如示例所示,指向 Foo::a 和 Foo::b 的两个指针都得到了一个1
。谁能解释一下这里发生了什么?
首先,指向成员的指针不需要实现为"对象的起始地址"(一个不是语言标准一部分的概念(的偏移量。事实上,某些类型的成员指针无法像那样实现。
相反,你所看到的只是basic_ostream::operator<<(bool)
.指向成员的指针不能隐式转换为许多其他类型的,但可以转换为bool
。您看到的1
只是指示您已传递非 null 成员指针。
尽管 Sneftel 提供的答案是正确的,但这是查看指向成员的指针的"实际"(内部(值的一种方法:
#include <iostream>
struct x {
int a, b;
};
int main() {
int x::* pa = &x::a;
int x::* pb = &x::b;
std::cout << pa << ' ' << pb << 'n';
std::cout << *(int*)&pa << ' ' << *(int*)&pb << 'n';
}
在线试用!
这可能具有不同的值或导致未定义的行为,具体取决于实现。也不能保证sizeof int == sizeof pa
.
大多数编译器都支持使用 <cstddef>
中定义的offsetof
宏。只是要注意陷阱,引用cpp偏好:
如果类型不是标准布局类型,则行为未定义 (直到 C++17(有条件地支持使用 offset 宏 (自C++17年起(。
如果成员是静态成员或成员函数,则行为为 定义。
例:
#include <iostream>
#include <cstddef>
class Foo {
public:
int a;
int b;
};
int main() {
std::cout << offsetof(Foo, a) << std::endl;
std::cout << offsetof(Foo, b) << std::endl;
}
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 共享 C++ 的数据成员指针
- C++数据成员:值与指针
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 如何在C++中使用类对象访问指针数据成员
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- 通过指针算法访问结构数据成员
- 如何强制实施有关指针数据成员的常量正确性
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 检查课程是否具有指针数据成员
- 处理类的指针数据成员的动态内存
- 在堆上启动的指针数据成员
- 运算符重载与 C++ : 具有指针数据成员的类
- 我是否需要清理非指针数据成员
- 在堆或堆栈上的指针类实例中分配C++非指针数据成员
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 从Cocos2d::Layer派生的类有一个指针数据成员.这个元素也有一个向量容器.调用vector::push_bac
- 移动非指针数据成员的语义
- c++:指针数据成员在类继承层次结构中的行为