this指针

1.用结构作参数
struct Base{
    int x;
    char y;
};
 
int fun(Base b){
    return b.x + b.y;
}
 
int main(int argc, char* argv[])
{
    Base b;
    b.x = 1;
    b.y = 2;
    fun(b);
    getchar();
}
反汇编:
 
总结:
    将结构体直接做为参数传递的时候,传递的是整个结构体;
    当结构较大时,会比较消耗内存,最好使用结构指针做参数;
 
 用结构指针做参数:
typedef struct{
    int x;
    char y;
}Base, *pBase;
 
int fun(pBase b){
    return b->x + b->y;
}
 
int main(int argc, char* argv[]){
    Base b;
    b.x = 1;
    b.y = 2;
    fun(&b);
    getchar();
}
 
2.函数放结构体中
一般函数放在结构体外面;
函数放结构体里面也是可行的;
对于计算机来说,函数放结构体里面和外面没有本质的区别,都是在调用时call一个地址;
但对于编译器来说,放在结构体里面的函数无法直接调用,必须告诉编译器函数属于哪个结构才行,也就是必须 结构.函数 的方式来调用;
 
放在结构体里面的函数:
struct myClass{
    int x;
    int y;
 
    int plus(myClass* p){
        return p->x + p->y;        
    }
};
 
int main(int argc, char* argv[])
{
    myClass c;
    c.x = 1;
    c.y = 2;
    c.plus(&c);
 
    getchar();
}
反汇编分析:
          
可以看到相比放结构体外面的函数,多传递了一个结构体的首地址;
放结构体里面的函数即使不带参数,也会通过ecx将结构体首地址当传递到函数中;
 
继续查看函数里面:
可以看到放结构体里面的函数调用约定并不是用的普通的外平栈;
 
用sizeof myClass查看结构体的大小,发现是8个字节,也就是只有两个int大小;
说明虽然函数在结构体里,单并不是直接将函数地址放结构体里面;
结构体里面是否放函数对结构体容量没有影响;
 
3.封装、类、成员函数
封装:            
    将函数定义到结构体内部,就是封装;            
    编译器会自动传递结构体的指针给函数,使用里面的变量会比较方便;            
            
类:            
    带有函数的结构体,称为类;         
 
对象:
    通过结构体创建的变量就是对象;
            
成员函数:            
    结构体里面的函数,称为成员函数;    
 
4.this指针
函数放结构体里面对结构体的大小没影响;
也就是说实际上函数并不属于结构体,仅仅是告诉编译器该函数属于哪个结构体,然后在调用函数前必须告诉编译器是哪个结构的函数;
编译器会默认给房结构体里面的函数传递结构体的指针;
这个指针称为this指针;
 
显式调用this指针:
struct myClass{
    int x;
    int y;
 
    int plus(){
        return this->x + this->y;        
    }
};
 
 
int main(int argc, char* argv[])
{
    printf("sizeOf plus2:%d\n",sizeof myClass);
 
    myClass c;
    c.x =1;
    c.y =2;
    printf("1+2=%d\n",c.plus());
    getchar();
}
结果:
    
 
编译器不允许this指针重新复制,因为this是c++中的关键词,专门用来指向结构首地址的,不像普通指针一样可以指向多种值;
也就是不能用:this++;
 
总之c++本质上就是c,只不过编译器会帮我们做一些事情;
代价就是必须遵守c++的一些规则;
 
 
 
 
posted @ 2019-11-27 10:03  L丶银甲闪闪  阅读(219)  评论(0编辑  收藏  举报