码迷,mamicode.com
首页 > 编程语言 > 详细

C++知识点

时间:2019-07-08 00:02:36      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:span   his   return   传递   ptr   大小   定长参数   函数   printf   

1、直接使用结构体做为参数

struct sclass            
{            
    int a;        
    int b;        
};            
int Plus(int a,int b)            
{            
    return a+b;        
}            
            
int main(int argc, char* argv[])            
{            
    sclass s;        
    s.a = 10;        
    s.b = 20;        
            
    int x = Plus(s.a,s.b);        
            
    printf("%d\n",x);        
    return 0;        
}            

总结:

将结构体直接做为参数传递的时候,传递的是整个结构体.

反汇编:

sub esp,10h
mov eax,esp
mov ecx,dword ptr [ebp-10h]
mov dword ptr [eax],ecx
mov edx,dword ptr [ebp-0Ch]
mov dword ptr [eax+4],edx
mov ecx,dword ptr [ebp-8]
mov dword ptr [eax+8],ecx
mov edx,dword ptr [ebp-4]
mov dword ptr [eax+0Ch],edx
call @ILT+35(Plus) (00401028)
add esp,10h

2、传递结构体指针

struct sclass            
{            
    int a;        
    int b;        
    int c;        
    int d;        
};            
int Plus(sclass* sc)            
{            
    return sc->a+sc->b;        
}            
int main(int argc, char* argv[])            
{            
    sclass s;        
    s.a = 10;        
    s.b = 20;        
            
    int x = Plus(&s);        
            
    printf("%d\n",x);        
    return 0;        
}            

反汇编:

mov dword ptr [ebp-10h],0Ah
mov dword ptr [ebp-0Ch],14h
lea eax,[ebp-10h]
push eax
call @ILT+40(Plus) (0040102d)
add esp,4

3、函数可以放在结构体里面,也可以放在结构体外面

struct sclass                
{                
    int a;            
    int b;            
    int c;            
    int d;            
                
    int Plus(sclass* sc)            
    {            
        return sc->a+sc->b;        
    }            
};                
                

探测:通过sizeof来探测将函数放在里面与外面结构体的大小有什么变化?

4、函数放在里面如何使用的问题 观察反汇编:

struct sclass                
{                
    int a;            
    int b;            
    int c;            
    int d;            
                
    int Plus(sclass* sc)            
    {            
        return sc->a+sc->b;        
    }            
};                
                
int main(int argc, char* argv[])                
{                
    sclass s;            
    s.a = 10;            
    s.b = 20;            
                
    int x = s.Plus(&s);            
                
    printf("%d %x\n",x,sizeof(s));            
    return 0;            
}                
                

注意观察反汇编:

1、参数传递

2、堆栈平衡

有没有发现什么问题?

 

5、封装、类、成员函数

    struct sclass                
    {                
        int a;            
        int b;            
        int c;            
        int d;            
                    
        int Plus()            
        {            
            return a+b;        
        }            
    };                
                    
    int main(int argc, char* argv[])                
    {                
        sclass s;            
        s.a = 10;            
        s.b = 20;            
                    
        int x = s.Plus();            
                    
        printf("%d %x\n",x,sizeof(s));            
                    
        return 0;            
    }                

封装:

1、将函数定义到结构体内部,就是封装.

2、编译器会自动传递结构体的指针给函数.

类:

带有函数的结构体,称为类.

成员函数:

结构体里面的函数,称为成员函数.


 6、什么是this指针?

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

观察反汇编:

lea ecx,[ebp-10h]
call @ILT+90(Plus) (0040105f)

this指针的特点:

1、你用或者不用,它就在那里

2、参数个数确定的时候,用ecx来传递

3、参数个数不确定的时候,最后一个传递(参见不定长参数)

4、this指针不能做++ -- 等运算,不能重新被赋值.

5、this指针不占用结构体的宽度.

//显示使用this指针                
                
struct sclass                
{                
    int a;            
    int b;            
                
    void Init(int a,int b)            
    {            
        this->a = a;        
        this->b = b;        
    }            
    void Print()            
    {            
        printf("%d %d",a,b);        
    }            
                
};                
                
sclass s;                
                
s.Init(1,2);                
                
s.Print();                

 

C++知识点

标签:span   his   return   传递   ptr   大小   定长参数   函数   printf   

原文地址:https://www.cnblogs.com/louzi/p/11148721.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!