C++ 类外访问类的私有成员变量

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

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", 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值