C++对象原型

本文深入探讨了C++对象在内存中的表示方式,解释了数据成员与成员函数之间的联系,并通过实例说明了this指针的作用。重点分析了对象状态的记录与成员函数的共享代码在实际应用中的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++的对象在内存中是怎么表示的,数据成员和成员函数之间有什么关系,this指针到底是干嘛的。

这里不考虑虚函数表

一个对象内存中占的大小其实就是他的数据成员的大小

   这是我用的例子

  

class T
{
public:
    T() {}
    void info() const {
        cout << "info\n";
    }
    void printValue() const {
        cout << "value is " << m_value << '\n';
    }
    void fun() const {
        cout << "fun!\n";
    }
private:
    int m_value;
};

注释掉fun函数和没注释的大小都是一个int的大小,4byte。

那么成员函数类是共用一份代码,但是我们在使用的时候,为什么感觉是每个对象都自己有一份,这和两个方面有原因。我们在施加一个动作给一个对象时,这个对象的状态只能由它的数据成员能够记录和表示,我们在需要施加操作的对象身上由它的对象的数据成员所代表的状态是我们预期的结果,是我们感觉是各自一份。还有就是this指针是造成假象的技术实现。

int main()
{
    T *p = NULL;
    p->info();
//    p->printValue();
//    t *p2 = NULL;
//    info(p2);
    
//    cout << sizeof(T) << endl;
    
    
    return 0;
}

我们在main函数中写了这段代码,你认为只是不可接受的,确实是,你不能对一个NULL执政施加操作,可是结果是

这样的

它很好的运行了。

现在我们写了这一段代码

struct t {
    int m_value;
};

void info(const t *p) {
    cout << "info\n";
}

void printValue(const t *p) {
    cout << "value is " << p->m_value << '\n';
}

在main函数中写了这段

int main()
{
//    T *p = NULL;
//    p->info();
//    p->printValue();
    t *p2 = NULL;
    info(p2);

//    cout << sizeof(T) << endl;


    return 0;
}

其实这两个已经可是了解C++对象的原型了,p2就是this指针,它是NULL,不过我们在info中没有使用它,所以它没什么影响,这就是第一段代码能够运行的原因,可是如果我们call了printValue函数,this是NULL,我们在函数中访问了它的m_value,我们省略了this->,这就和
void printValue(const t *p)
一样

一个内存段错误。




转载于:https://my.oschina.net/u/854744/blog/418202

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值