首先,this指针一般存在于class之中,我们都知道class里有着成员变量还有成员函数,其实每个类成员都有着一个this指针,包括构造函数和析构函数。
简单地说,this指针就是一个指向自身的指针。那么它有什么用呢?
通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。
实际上任何对类成员的直接访问都可以看做this指针的隐式使用,可以看下下面的代码:
class A{
private:
int a;
public:
A(int x) { a = x; }
}
实际上在调用A的构造函数的时候是这样的:
class A{
private:
int a;
public:
A(int x) { this->a = x;}
}
那么我们怎么知道this指向这个调用对象本身呢?have a try:
class A{
private:
int a;
public:
A(int x) { a = x; }
int getaddr() { cout << this; }
}
int main(){
A aa;
aa.getaddr();
cout << endl << &aa;
return 0;
}
可能还是有人不太明白为什么要用这个this指针,通过下面这个程序你可以明白一点(C++Primier上的)
其实就是上面那句话:
通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。
如果我们要在上述的class A中添加一个成员函数,需要比较a的大小,并返回a值较大的那个类对象,那我们应该怎么做呢?考虑到该方法要比较两个对象的a的值,所以必须将第二个对象当做参数传递给它,我们可以使用引用来传递它,其次还需要返回一个结果,就是返回一个引用,指向a值较大的那个对象,因此函数原型可以是这样:
const A& comp_a(const A& aa) const;
括号内的const代表着该函数不会修改被显式地访问的对象,括号后面的const表明不会修改被隐式地访问的对象,而该函数返回了两个const引用之一,所以返回类型也需要const修饰。
让我们来看一下什么是显式访问什么是隐式访问:
A1.comp_a(A2); //显式访问了A2,隐式访问了A1
A2.comp_a(A1); //显式访问了A1,隐式访问了A2
好,我们接下来实现这个函数:
const A& A::comp_a(const A& aa) const
{
if(aa.a > a)
return aa;
else
return ???;
}
很尴尬,我们在这里并不知道称呼这个调用comp_6()方法的对象...
其实this指针就是指向用来调用成员函数的对象,就是它的称呼啦:
const A& A::comp_a(const A& aa) const
{
if(aa.a > this->a)
return aa;
else
return *this;
}
其中还有一个变化,相比你们都能看出来,我把if判断语句中省略的一个this指正给写出来了,其实你不写也没有问题,但是编译的时候,它还是会自动给我们添加的啦
为什么返回的是*this呢?因为我们要返回的是对象而不是地址哦~