| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1523 人关注过本帖
标题:C++ 类的学习(非礼勿视)
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
收藏
 问题点数:0 回复次数:2 
C++ 类的学习(非礼勿视)
类的声明
程序代码:
#ifndef STOCK00_H_
#define STOCK00_H_
class Cstock{
private:
    int a,b;
public:
    void function1(int num1,int num2);
    int function2();
};
#endif


类的实现
程序代码:
#include "StdAfx.h"
#include "Cstock.h"

void Cstock::function1(int num1,int num2)
{
    a=num1;
    b=num2;
}

int Cstock::function2()
{
    return a+b;
}


主程序
#include "stdafx.h"
#include "Cstock.h"
#include <stdio.h>
#include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[])
{
    Cstock stock1;
    int num;
    stock1.function1(3,4);
    num=stock1.function2();
    printf("%d\n",num);
    getchar();
}


主程序反编译

程序代码:
.text:00411460 wmain           proc near               ; CODE XREF: j_wmainj
.text:00411460
.text:00411460 var_DC          = byte ptr -0DCh
.text:00411460 var_18          = dword ptr -18h
.text:00411460 var_C           = byte ptr -0Ch
.text:00411460
.text:00411460                 push    ebp
.text:00411461                 mov     ebp, esp
.text:00411463                 sub     esp, 0DCh
.text:00411469                 push    ebx
.text:0041146A                 push    esi
.text:0041146B                 push    edi
.text:0041146C                 lea     edi, [ebp+var_DC]
.text:00411472                 mov     ecx, 37h
.text:00411477                 mov     eax, 0CCCCCCCCh
.text:0041147C                 rep stosd


                                                                
.text:0041147E                 push    4                               
.text:00411480                 push    3   
                                                     
.text:00411482                 lea     ecx, [ebp+var_C]        --------------------〉这句值得注意


.text:00411485                 call    j_Cstock__function1    调用函数 function1

.text:0041148A                 lea     ecx, [ebp+var_C]
.text:0041148D                 call    j_Cstock__function2
.text:00411492                 mov     [ebp+var_18], eax
.text:00411495                 mov     esi, esp
.text:00411497                 mov     eax, [ebp+var_18]
.text:0041149A                 push    eax
.text:0041149B                 push    offset Format   ; "%d\n"
.text:004114A0                 call    ds:__imp__printf



.text:004114A6                 add     esp, 8
.text:004114A9                 cmp     esi, esp
.text:004114AB                 call    j__RTC_CheckEsp
.text:004114B0                 mov     esi, esp
.text:004114B2                 call    ds:__imp__getchar
.text:004114B8                 cmp     esi, esp
.text:004114BA                 call    j__RTC_CheckEsp
.text:004114BF                 xor     eax, eax
.text:004114C1                 push    edx
.text:004114C2                 mov     ecx, ebp
.text:004114C4                 push    eax
.text:004114C5                 lea     edx, dword_4114E8
.text:004114CB                 call    j__RTC_CheckStackVars
.text:004114D0                 pop     eax
.text:004114D1                 pop     edx
.text:004114D2                 pop     edi
.text:004114D3                 pop     esi
.text:004114D4                 pop     ebx
.text:004114D5                 add     esp, 0DCh
.text:004114DB                 cmp     ebp, esp
.text:004114DD                 call    j__RTC_CheckEsp
.text:004114E2                 mov     esp, ebp
.text:004114E4                 pop     ebp
.text:004114E5                 retn
.text:004114E5 wmain           endp



Function1 反编译
程序代码:
.text:004113C0 Cstock__function1 proc near             ; CODE XREF: j_Cstock__function1j
.text:004113C0
.text:004113C0 var_CC          = byte ptr -0CCh
.text:004113C0 var_8           = dword ptr -8
.text:004113C0 arg_0           = dword ptr  8
.text:004113C0 arg_4           = dword ptr  0Ch
.text:004113C0
.text:004113C0                 push    ebp
.text:004113C1                 mov     ebp, esp
.text:004113C3                 sub     esp, 0CCh
.text:004113C9                 push    ebx
.text:004113CA                 push    esi
.text:004113CB                 push    edi
.text:004113CC                 push    ecx
.text:004113CD                 lea     edi, [ebp+var_CC]
.text:004113D3                 mov     ecx, 33h
.text:004113D8                 mov     eax, 0CCCCCCCCh
.text:004113DD                 rep stosd




.text:004113DF                 pop     ecx       --------------------------〉这句对应于主函数  lea  ecx, [ebp+var_C] ecx指向主函数的栈底往后数C的地址上

.text:004113E0                 mov     [ebp+var_8], ecx    ---------〉将这个地址存放到本函数栈内  

.text:004113E3                 mov     eax, [ebp+var_8]     ---------->将这个值给eax
.text:004113E6                 mov     ecx, [ebp+arg_0]     -----------〉ecx =3

.text:004113E9                 mov     [eax], ecx           ----------->这句将3的值存放到 eax指向的内存中去 而eax的值是指向主函数的栈ebp-12的地方

.text:004113EB                 mov     eax, [ebp+var_8]     
.text:004113EE                 mov     ecx, [ebp+arg_4]
.text:004113F1                 mov     [eax+4], ecx      ------------〉这个地方是将4的值存放到主函数的栈ebp-8的地方 




.text:004113F4                 pop     edi
.text:004113F5                 pop     esi
.text:004113F6                 pop     ebx
.text:004113F7                 mov     esp, ebp
.text:004113F9                 pop     ebp
.text:004113FA                 retn    8
.text:004113FA Cstock__function1 endp


Function2 反编译
程序代码:
.text:00411410 Cstock__function2 proc near             ; CODE XREF: j_Cstock__function2j
.text:00411410
.text:00411410 var_CC          = byte ptr -0CCh
.text:00411410 var_8           = dword ptr -8
.text:00411410
.text:00411410                 push    ebp
.text:00411411                 mov     ebp, esp
.text:00411413                 sub     esp, 0CCh
.text:00411419                 push    ebx
.text:0041141A                 push    esi
.text:0041141B                 push    edi
.text:0041141C                 push    ecx
.text:0041141D                 lea     edi, [ebp+var_CC]
.text:00411423                 mov     ecx, 33h
.text:00411428                 mov     eax, 0CCCCCCCCh
.text:0041142D                 rep stosd


.text:0041142F                 pop     ecx                       -------------------〉这句对应于主函数  lea  ecx, [ebp+var_C]
.text:00411430                 mov     [ebp+var_8], ecx
.text:00411433                 mov     eax, [ebp+var_8]           让eax指向主函数栈 ebp-12的地方

 
.text:00411436                 mov     eax, [eax]                  取主函数栈ebp-12存放的值
.text:00411438                 mov     ecx, [ebp+var_8]           给让ecx也指向驻函数ebp-12的地方

.text:0041143B                 add     eax, [ecx+4]                   ---------------------------〉return a+b


.text:0041143E                 pop     edi
.text:0041143F                 pop     esi
.text:00411440                 pop     ebx
.text:00411441                 mov     esp, ebp
.text:00411443                 pop     ebp
.text:00411444                 retn
.text:00411444 Cstock__function2 endp




结论
1. 类的私有变量  定义类的实例 在哪个函数里,那么类的私有变量就在哪个函数的栈里面
2. 类的方法调用,和普通的函数调用是没多大区别的
3。类的私有变量不能被外部程序访问,并不是指可执行程序的场景,而是指编译器在编译的过程中不允许发生这样的事情

[ 本帖最后由 zhu224039 于 2014-6-12 18:21 编辑 ]
搜索更多相关主题的帖子: include 
2014-06-12 18:18
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
楼主总结的不错 这里是比较简单的情况 如果考虑多态就有意思多了
2014-06-12 20:03
xkwy0000
Rank: 6Rank: 6
等 级:贵宾
威 望:11
帖 子:107
专家分:441
注 册:2013-2-8
收藏
得分:0 
这个反汇编软件真的很了不起,
如果想了解更多的关于编译器,
需要依靠它才行。         
   
2014-06-14 21:14
快速回复:C++ 类的学习(非礼勿视)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.066571 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved