cpp1 封装和this指针

Cpp1 封装和this指针

封装

C语言和C++语言的区别

C++是对C的补充扩展,C原有的语法C++都支持,并在此基础上扩展了一些新的语法:
继承、封装、多态、模板等等

结构体可以作为参数传递吗

struct Student
{
    int a;
    int b;
    int c;
    int d;
}

//分析这个函数是如何传递参数的

int Plus(student s)
{
    return s.a+s.b+s.c+s.d;
}


23:       Student s = {1,2,3,4};
00401078   mov         dword ptr [ebp-10h],1
0040107F   mov         dword ptr [ebp-0Ch],2
00401086   mov         dword ptr [ebp-8],3
0040108D   mov         dword ptr [ebp-4],4
24:       Plus(s);
00401094   sub         esp,10h
00401097   mov         eax,esp
00401099   mov         ecx,dword ptr [ebp-10h]
0040109C   mov         dword ptr [eax],ecx
0040109E   mov         edx,dword ptr [ebp-0Ch]
004010A1   mov         dword ptr [eax+4],edx
004010A4   mov         ecx,dword ptr [ebp-8]
004010A7   mov         dword ptr [eax+8],ecx
004010AA   mov         edx,dword ptr [ebp-4]
004010AD   mov         dword ptr [eax+0Ch],edx
004010B0   call        @ILT+5(Plus) (0040100a)
004010B5   add         esp,10h



16:   int Plus(Student s)
17:   {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,40h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
18:       return s.a+s.b+s.c+s.d;
00401038   mov         eax,dword ptr [ebp+8]
0040103B   add         eax,dword ptr [ebp+0Ch]
0040103E   add         eax,dword ptr [ebp+10h]
00401041   add         eax,dword ptr [ebp+14h]
19:   }


//经过观察我们可以发现,结构体参数是通过复制结构体传递参数的

将函数写到结构体里面,观察反汇编


struct Student
{
    int a;
    int b;
    int c;
    int d;
    int Plus()
    {
        return a+b+c+d;
    }
};

int main()
{
    Student s = {1,2,3,4};
    s.Plus();
    return 0;
}


14:       int Plus()
15:       {
00401060   push        ebp
00401061   mov         ebp,esp
00401063   sub         esp,44h
00401066   push        ebx
00401067   push        esi
00401068   push        edi
00401069   push        ecx
0040106A   lea         edi,[ebp-44h]
0040106D   mov         ecx,11h
00401072   mov         eax,0CCCCCCCCh
00401077   rep stos    dword ptr [edi]
00401079   pop         ecx
0040107A   mov         dword ptr [ebp-4],ecx
16:           return a+b+c+d;
0040107D   mov         eax,dword ptr [ebp-4]
00401080   mov         eax,dword ptr [eax]
00401082   mov         ecx,dword ptr [ebp-4]
00401085   add         eax,dword ptr [ecx+4]
00401088   mov         edx,dword ptr [ebp-4]
0040108B   add         eax,dword ptr [edx+8]
0040108E   mov         ecx,dword ptr [ebp-4]
00401091   add         eax,dword ptr [ecx+0Ch]
17:       }


22:       Student s = {1,2,3,4};
0040D4F8   mov         dword ptr [ebp-10h],1
0040D4FF   mov         dword ptr [ebp-0Ch],2
0040D506   mov         dword ptr [ebp-8],3
0040D50D   mov         dword ptr [ebp-4],4
23:       s.Plus();
0040D514   lea         ecx,[ebp-10h]
0040D517   call        @ILT+10(Student::Plus) (0040100f)
24:       return 0;
0040D51C   xor         eax,eax


//我们可以发现此时结构体是通过指针传参数。
//跟使用定义为指针的外部方法一样的调用方式和处理方式

观察结构体的大小:

struct Student
{
    int a;
    int b;
    int c;
    int d;
    int Plus()
    {
        return a+b+c+d;
    }
};

int main()
{
    Student s = {1,2,3,4};
    s.Plus();
    return 0;
}

//对比

struct Student
{
    int a;
    int b;
    int c;
    int d;
};


    int Plus(Student* s)
    {
        return s=>a+s=>b+s->c+s->d;
    }

int main()
{
    Student s = {1,2,3,4};
    Plus(&s);
    return 0;
}

//我们发现上述两种定义方式基本一样

结论:
在结构体内定义函数,函数其实并不属于这个结构体,这样做仅仅是为了使用方便。
将函数定义写入到结构体内部,也就是我们所说的封装

封装总结

  1. 什么是发封装:将函数定义到结构体内部,就是封装
  2. 什么是类:带有函数的结构体,称为类
  3. 什么是成员函数:结构体里面的函数,称为成员函数

this指针

什么是this指针

struct Student
{
    int a;
    int b;
    int c;
    int d;
    int Plus()
    {
        return a+b+c+d;
    }
}

总结:

  1. this指针是编译器默认传入的,通常都会使用ecx进行参数的传递。
  2. 你用或者不用,他都在那。

this指针的使用

struct Student
{
    int a;
    int b;
    void Init(int a,int b)
    {
        this->a=a;
        this->b=b;
    }
    
    void Print()
    {
        printf("%d %d",a,b);
    }
}

总结:

  1. this指针不能做 ++ -- 等运算,不能重新被赋值。
  2. this指针不占用结构体的宽度 。

总结

  1. this指针是编译器默认传入的,通常都会使用ecx进行参数的传递。
  2. 成员函数都有this指针,无论是否使用。
  3. this指针不能做++ --等运算,不能重新被赋值。
  4. this指针不占用结构体的宽度。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容