什么是this指针?
this指针是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。举例来说:当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身。 this指针只能在一个类的成员函数中调用,它表示的是当前对象的地址。
this指针的性质:
- 类型:类类型*const
- this指针并不是类本身的一部分,不影响sizeof(类)的大小
- this指针作用域在类成员函数内部
- this指针是非静态成员函数的一个隐含指针形参,是编译器自己给的,不能由程序员手动添加。
- 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
- 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
给出一个类,如下:
class Test
{
public:
void func()
{
cout<<"mvalue:"<<mvalue<<endl;
}
private:
int mvalue;
};
int main()
{
Test t1,t2;
t1.func();
t2.func();
return 0;
}
我们知道,一个Test类可以生成很多对象,每个对象都有自己的成员变量mvalue值,但是所有对象共享成员方法,比如这里的func成员函数,那么通过不同的对象t1和t2来调用同一个func方法,这个func方法怎么知道打印谁的mvalue值呢?对了,就是this指针的作用,看看调用具体是怎么发生的,如下:
t1.func() ====> Test::func(&t1);
t2.func() ====> Test::func(&t2);
通过t1和t2对象来调用成员方法func,实际在汇编上,是调用了类Test作用域下的func方法,把调用方法的对象当做实参传递进去了,那么既然编译器自己把对象的地址当做实参进行传递,相应的它就得加个形参来就收,因此,上面的代码经过编译器编译后,就编程这样了:
class Test
{
public:
void func(Test *const this)
{
cout<<"mvalue:"<<mvalue<<endl;
}
private:
int mvalue;
};
int main()
{
Test t1,t2;
t1.func();
t2.func();
return 0;
}
你可以看到,成员方法func的形参多了this指针,就是指向调用该方法的对象的,在func函数里面访问mvalue值,前面都添加了this->mvalue,因此,哪个对象调用方法,方法里面就是访问的哪个对象的数据,this在此作为一个桥梁!
this指针是类中非静态this指针的作用是什么?
this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)
为什么需要this指针?
因为this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。
this指针是什么时候创建的?
this在成员函数的开始执行前构造,在成员的执行结束后清除。
但是如果class或者struct里面没有方法的话,它们是没有构造函数的,只能当做C的struct使用。采用 TYPE xx的方式定义的话,在栈里分配内存,这时候this指针的值就是这块内存的地址。采用new的方式创建对象的话,在堆里分配内存,new操作符通过eax返回分配的地址,然后设置给指针变量。之后去调用构造函数。