this指针到底是什么?
this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。
我们操作一个对象时,编译器怎么知道我们操作的是哪个对象呢?
实际上,编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。
例如
//在成员函数内
void show()
{
cout<<i<<endl;
//实际上编译器处理后:cout<<this->i<<endl;
}
实际上
this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值;
this指针是类的指针,指向对象的首地址;
this指针只能在成员函数中使用;
this指针在成员函数的开始执行前构造的,在成员的执行结束后清除。
下面做出演示
#include<iostream>
using namespace std;
class Object
{
private:
int _a;
int _b;
public:
Object(int a, int b) :_a(a), _b(b) {}
void show_this()
{
cout << "this =" << this << endl;
}
~Object() {}
};
void test()
{
Object obj1(1, 2);
cout << "&obj1=" << &obj1 << endl;
obj1.show_this();
cout << "=========" << endl;
Object obj2(1, 2);
cout << "&obj2=" << &obj2 << endl;
obj2.show_this();
}
void test1()
{
Object obj1(1, 2);
cout << this << endl;
}
int main()
{
//test();
//test1();
return 0;
}
test()运行结果
这里我们发现this其实就是指向对象首地址的指针
test1()运行结果报错,
this的使用
当我们想要返回对象本身的时候,就直接return *this;
例如在深拷贝时候,会进行检查,如果是对自身的拷贝,则直接返回。
Person& Person::operator=(const Person& p)
{
if (this == &p) //检查是否是对自身的拷贝
return *this;
delete m_Height;
m_Height = new int(*p.m_Height);
return *this;
}