C++ 类外访问类的私有成员变量
之前一直不太清楚对象的成员变量和成员函数在内存中的占用情况,今天想要直接通过一个对象的变量名去访问其内部的成员变量,特地去看了一下对象中的内存布局。
直接说结论:
- 对于没有继承的情况,对象所占内存的大小和C结构体类似,仅需考虑内存对齐+每个基本成员变量的内存大小就计算出对象所占内存。
- 对于有继承的情况,如果有虚函数,那么除了基本的成员变量外还会存储一个虚表指针,这个指针的位置可能在这个对象的内存的头部也可能在尾部,这个视编译器而定。派生类对象的内存大小会是父类大小加上自身所添加的成员变量。
- 对于空类,大小为1。
- 成员函数是不占用对象的内存空间的,成员函数存储在代码段,全局只有一个。无论声明多少个对象,所有对象所调用的成员函数都是代码段的这一个。
具体可参考C++成员函数在内存中的存储方式
理解了以上内容,那就可以直接用对象名去访问成员变量了:
class Person {
public:
Person() {
}
Person(int id, string name, double height) : m_id(id),
m_name(name), m_height(height) {
}
int getNum() {
return 10;
}
private:
int m_id;
std::string m_name;
double m_height;
};
void foo() {
// 栈空间
Person p{
10, "snow"

本文探讨了C++中类外如何访问私有成员变量,详细解释了对象内存布局,包括没有继承、有继承且包含虚函数、空类的情况。成员函数不占用对象内存,存储在代码段。通过C风格强转访问成员变量的方式不考虑字节对齐是错误的。在考虑字节对齐后,正确访问成员变量,展示了在64位编译器下不同类型成员变量的内存占用。理解这些原理有助于理解C++17的结构化绑定特性。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



