首页 > 代码库 > C++的this指针

C++的this指针

1. 一个对象占多大空间呢?

             是由对象里面的成员变量决定的。

  2.成员函数保存在哪儿?

          不在对象的内存里面,它在代码区。所有函数写完都在代码区,只有在调用的时候才去代码区找。既然函数不在对象里,那么函数里面的那个this指针代表当前对象是怎么回事???

 3.调用成员函数时,会自动传this指针

 4. this指针是指向当前对象的指针 

 5. 在成员函数中,可以将this指针当参数传递,也可以返回this指针,或返回通过this指针拿到的对象



#include <iostream>
using namespace std;

//日期类
class Date{
    int year,month,day;
   // int x;
    
public:
    //构造方法   初始化列表初始化成员变量
    Date(int _y,int _m,int _d):year(_y),month(_m),day(_d){
    
    }
 
    
    #pragma 问题 --- -现在有个问题:参数名跟变量名一样,如何区分开哪个是参数哪个是变量???
    /*
   
    void set(int year,int month,int day){

        //局部变量优先原则:在这里编译器会把参数year赋值给参数year。所以我们只需要告诉编译器哪个是当前对象的成员变量即可
        year = year;
        month = month;
        day = day;
    }
   
     */
    
    
    void setValue(int year,int month,int day){
        this -> year = year; //this -> year是成员变量  指针访问成员变量用箭头
        this -> month = month;
        this -> day = day;
      //  x = 800;  //一般情况下用到成员变量 默认添加 this -> x
    }
    
#pragma 问题 --- this  指针哪里来的?????
    
    //把当前对象传进函数里面    显式显示出来了self指向当前对象
    //同理this也是一样的,只要把self改成this即可,因为给this传的就是当前调用函数的那个对象
    
    //这部分是编译器做的事情,编译器把这部分隐藏了
    void setValue2(int year,int month,int day,Date* self){
        self -> year = year;
        self -> month = month;
        self -> day = day;
        
    }
    
    #pragma mark- 调用函数的时候隐式的传一个Date* this指针进去。如果是OC里隐式传一个self指针
    void test(){
        this->year = 2002;
        cout << "this保存的地址:" << this << endl;
    }
    
    void show();
};


//在.cpp里面写函数如果没有指定是哪个类的函数  那么它就是全局函数
#pragma 全局函数的调用 不需要对象去调用,也就没有当前对象了。没有当前对象那么void show(this)这里就不会传进this指针   如果没有this指针,就不知道hour变量到底是哪个对象的
/*
void show(){
    cout << hour << "时" << min << "分" << sec << "秒" << endl;
}
 */

#pragma  如果是写成成员函数的话,那么就是通过对象去调用该函数。哪个对象调用的就把自己传进来,那么这个hour也就是调用函数的那个对象的hour .就像OC里面调用方法的时候里面传进一个self



//主函数
int main(){
    
    Date d(2015,1,23);
    
#pragma 问题 --- 既然函数不在对象中,那么对象是怎么调用函数的???函数在代码区  函数名实际上是一个函数指针,指向代码区的一个函数。既然在代码区,那么那个this->year的this是哪出来的??
    d.setValue(2018, 8, 8);
    //this指向当前对象,意思是指向调用这个函数的对象   谁调用这个函数,this就指向当前对象
    
    Date d2(2013,11,28);
    d2.setValue2(2019, 8, 15,&d2);//虽然是成员函数,也是放在代码区的,等真正调用到的时候通过函数指针去代码区找到这个函数运行。而创建对象的那块内存空间并没有放函数
    

    cout << "对象的地址: "  << &d << endl;
    d.test();//把当前对象自己 隐式地传进去  d.test(&d);只是这些事情是编译器做的,所以在函数当中我们能够拿到一个this指针
 
    return 0;
}

运行结果如下:

对象的地址: 0x7fff5fbff830
this保存的地址:0x7fff5fbff830
Program ended with exit code: 0




C++的this指针