什么是this指针?
this指针表示对象所在内存的地址,是地址,不是指向该地址的指针!
this指针是作为类的隐藏变量成员存储在类中的吗?
不是!this指针绝对不占类内存的一点空间,如果this指针在内存内,那么在内存里面表示自己内存的地址,要访问该内存,需要先去内存里找到该内存的地址?是不是有点套娃的感觉?this指针是编译器管理的!
this指针是什么时候创建的?
这个命题很抽象,this指针并不是一个物理的对象,而是编译器的一种行为,先说说现象。
在一般我们的开发中,this指针表示的地址,是在使用new操作符时,自动生成的,如果想要可视化这个细节,请看下面的代码,不了解operator new的可以先去了解一下,类似于C语言中的malloc,new的底层也是对operator new进行了封装,并且增加了一个自动调用构造函数的过程。
下面的代码可以看到,t是一个创建在栈上的变量,在创建了内存后,t指向了一个分配的堆内存地址,而这个堆内存地址,刚好就是this指针的地址!所以this指针,表示的就是当前对象所在内存中的地址!
再补充一点,this指针并不作为一个物理的对象,被存储或者被创建,而是在需要被调用的时候(比如构造函数,或者访问非静态成员),编译器就会把this指针的地址传给该函数,所以this指针是编译器管理类中一些调用的行为。
推荐一个自己写的C++秋招项目(mini stl),如果你学完该项目,对C++的理解跟应用能力绝对会提高一大截!GitHub - yxc-s/MiniCppSTL: Cpper's homeland
class Test{
public:
Test(){}
void print_this(){
cout <<"this address: " << (this) << endl;
}
};
void main() {
Test* t = static_cast<Test*> (::operator new (sizeof(Test)));
new (t) Test();
cout << "stack address: " << (&t) << endl;
cout << "pointer address: " << t << endl;
t->print_this() ;
}
stack address: 0x76bddffc58
pointer address: 0x1ff2dcecc70
this address: 0x1ff2dcecc70