-
this指针
-
每个对象拥有一个this指针,通过this指针来访问自己的地址。
-
this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。
-
this指针只能在成员函数中使用,全局函数、静态函数都不能使用this指针
-
this指针在成员函数开始执行前构造,在成员函数执行结束后销毁。
-
this 虽然用在类的内部,但是只有在对象被创建以后才会给 this 赋值,并且这个赋值的过程是编译器自动完成的,
不需要用户干预,用户也不能显式地给 this 赋值。
-
1 在普通成员函数中,this是一个,指向非const对象的const指针
if class == Student
this == Student *const
2 在const成员函数中,this指针是一个,指向const对象的const指针
if class == Student
this == const Student *const
下面我们看下,this 确实指向了当前对象,而且对于不同的对象,this 的值也不一样。
#include<iostream>
using namespace std;
class Student{
public:
int a;
int b;
void printThis();
void print();
};
void Student::printThis(){
cout<<this<<endl;
}
int main(int argc, char const *argv[])
{
Student *pstu1 = new Student;
pstu1 -> printThis();
cout<<pstu1<<endl;
Student *pstu2 = new Student;
pstu2 -> printThis();
cout<<pstu2<<endl;
return 0;
}
输出:
0x7fba0ec00670
0x7fba0ec00670
0x7fba0ec00680
0x7fba0ec00680
- this指针到底是什么?
this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。
不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。
这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。
- 如何更深人的理解一下呢?
C++和C语言的编译方式不同。C语言中的函数在编译时名字不变,或者只是简单的加一个下划线_(不同的编译器有不同的实现),
例如,func() 编译后为 func() 或 _func()。
而C++中的函数在编译时会根据它所在的命名空间、它所属的类、以及它的参数列表(也叫参数签名)等信息进行重新命名,
形成一个新的函数名。这个新的函数名只有编译器知道,对用户是不可见的。对函数重命名的过程叫做名字编码(Name Mangling),是通过一种特殊的算法来实现的。
Name Mangling 的算法是可逆的,既可以通过现有函数名计算出新函数名,也可以通过新函数名逆向推演出原有函数名。
Name Mangling 可以确保新函数名的唯一性,只要函数所在的命名空间、所属的类、包含的参数列表等有一个不同,最后产生的新函数名也不同。
如果你希望看到经 Name Mangling 产生的新函数名,可以只声明而不定义函数,这样调用函数时就会产生链接错误,从报错信息中就可以看到新函数名。
扯得有点远了,我们来看下,成员函数的调用
void Student::print()
{
cout<<a<<endl;
cout<<b<<endl;
}
//编译后的代码,类似于
void new_function_name(Student* const this)
{
cout<<this->a<<endl;
cout<<this->b<<endl;
}
这样通过传递对象指针就完成了成员函数和成员变量的关联。
这与我们从表明上看到的刚好相反,通过对象调用成员函数时,不是通过对象找函数,而是通过函数找对象。
这一切都是隐式完成的,对程序员来说完全透明,就好像这个额外的参数this指针不存在一样。