1.概要
在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。
友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。
下面的实例有助于更好地理解 this 指针的概念:
#include <iostream>
using namespace std;
class Box
{
public:
// 构造函数定义
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
}
double Volume()
{
return length * breadth * height;
}
int compare(Box box)
{
return this->Volume() > box.Volume();
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
int main(void)
{
Box Box1(3.3, 1.2, 1.5); // Declare box1
Box Box2(8.5, 6.0, 2.0); // Declare box2
if(Box1.compare(Box2))
{
cout << "Box2 is smaller than Box1" <<endl;
}
else
{
cout << "Box2 is equal to or larger than Box1" <<endl;
}
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Constructor called.
Constructor called.
Box2 is equal to or larger than Box1
this指针的使用:
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
2.return this和return *this
return this返回当前对象的地址(指向当前对象的指针);
return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是克隆, 若返回类型为A&, 则是本身 );
return this示例:
#include <iostream>
using namespace std;
class A
{
public:
int x;
A* get()
{
return this;
}
};
int main()
{
A a;
a.x = 4;
if(&a == a.get())
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
return 0;
}
//输出:yes
return *this示例:
#include <iostream>
using namespace std;
class A
{
public:
int x;
A get()
{
return *this; //返回当前对象的拷贝
}
A &get2()
{
return *this; //返回当前对象
}
};
int main()
{
A a;
a.x = 4;
if(a.x == a.get().x)
{
cout << a.x << endl;
}
else
{
cout << "no" << endl;
}
A temp = a.get();
if(&a == &temp)
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
if(&a == &a.get2())
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
return 0;
}
输出如下:
4
no
yes
return *this时,若返回类型是A,则返回的是对象拷贝,若返回类型是A&,则返回的是对象本身(也就是引用);
参考资料:
http://www.runoob.com/cplusplus/cpp-this-pointer.html
https://blog.csdn.net/daimous/article/details/78618432
https://www.cnblogs.com/liushui-sky/p/5802981.html
https://www.cnblogs.com/zhangruilin/p/5769843.html