c++面向对象模型初探(含this指针)

本文通过实验展示了C++中类对象的内存布局原理,包括普通成员变量、静态数据成员及成员函数的存储位置,并解释了this指针的作用。

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

前面学习了静态成员和函数 最后一幅图抛出了一块砖  http://blog.youkuaiyun.com/x_y_q_/article/details/52164506 因为我们知道c++是在c的基础上进行拓展的嘛,很多看似高大上的功能其实我们花点时间去想想,去做做试验,便会知晓c++的那帮大牛们是怎么用原有的c语言的面向过程的思维去创造出这个我们看似全新的面向对象的思想理念。所以,我们很自然地会想去揭开c++面向对象那层神秘的面纱,一睹究竟。

还是先抛砖,现有下面一段代码,我们来做个小实验,看看一个类的长度到底是多少。(其中,函数,便是一个指针,指向函数的地址,他们的大小可以看作4个字节,一个指针变量所占用的内存大小嘛)

我们先在代码中标记出我们的预估值

#include <iostream>
#include <string.h>
using namespace std;

class C1{
public:
    int i;//4字节
    int j;//4字节
    int k;//4字节
};//12字节

class C2{
public:
    int i;//4
    int j;//4
    int k;//4

    static int m;//4  或  0
public:
    int getk(){return k;}//4  或 0
    void setK(int val) {k = val;}//4 或 0
};//24 或 20  或 12

struct S1{
    int i;//4
    int j;//4
    int k;//4
};//12

struct S2{
    int i;//4
    int j;//4
    int k;//4
    static int m;//4
};//16

int main()
{
   cout << sizeof(C1) << endl;
   cout << sizeof(C2) << endl;
   cout << sizeof(S1) << endl;
   cout << sizeof(S2) << endl;
   return 0;
}

下面来运行这串代码




结果似乎出人意料,但也可以在一定程度上反映了我们要探究的问题:


c++中的成员对象和成员函数是分开存储的


普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式

静态数据变量:存储于全局数据区中

成员函数:储存于代码段中


那么,问题又来了,很多对象共用一块代码,代码是如何区分具体对象的呢?换句话说,int getk() const {return k;} 代码是如何区分,具体obj1 obj2 obj3 的对象的k值呢?

其实,这里只是编译器在函数中隐藏了 this 指针,this指针是什么呢,就是指向某一个对象自身的指针。这样,在构造函数的时候,已经向形参里传入了this指针,在下面图片 中也

可以看出来。我们可以之后做一个关于this指针的实验。


静态成员函数里没有this指针


这就是c++对成员变量和成员函数的内部处理,仔细读图,是不是能反映以上几点呢。



下面,来进行this指针的实验


#include <iostream>
using namespace std;

class Test{
public:
    Test(int a, int b){
        this ->a = a;
        this ->b = b;
    }
    void printT(){
        cout << "a: " << a << endl;
        cout << "b: " << b << endl;
    }
private:
    int a;
    int b;
};

int main()
{
    Test t1(1, 2);//这里,谁调this,this就是谁,这里就是t1的地址
    t1.printT();//
    return 0;
}

运行结果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值