C++知识点

Posted louzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++知识点相关的知识,希望对你有一定的参考价值。

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++知识点的主要内容,如果未能解决你的问题,请参考以下文章

C++知识点大汇总

C++知识点汇总文档

C++基础知识点整理

C++深蓝学院课程:C++基础与深度解析 - 课程知识点目录

C++再谈vscode界面调试C++程序(linux) - 知识点目录

C++基础知识 | C++源码详解