this指针的用途:
1.当形参和成员变量同名时,可用this指针来区分。
2.在类的非静态成员函数中返回对象本身,可使用return *this
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码,那么问题是:
这一块代码是如何区分哪个对象调用自己的呢?
C++通过提供特殊的对象指针,this指针解决上述问题。
对象p1,p2,p3都要调用这个函数,怎么区分是谁调用的呢?
用this指针解决这个问题
this指针指向被调用的成员函数所属的对象
简单来说,谁调用这个函数,this指针就指向谁。
1.this指针是隐含每一个非静态成员函数内的一种指针。
2.this指针不需要定义,直接使用即可。
1、解决名称冲突:
现在让我们看一下名称冲突问题:
#include <iostream>
using namespace std;class Person {public:Person(int age) {age = age;}int age;};//1.解决名称冲突void test01() {Person p1(18);cout << "p1的年龄为:" << p1.age << endl;}
//2.返回对象本身用*thisint main() {test01();return 0;
}
结果为0,如果你用的编译器是vs,结果应该是乱码,我用的是Dev-C++。
编译器会认为这3个age是同一个age,跟你这个属性age不是一回事,所以我们从来没有给这个属性age进行赋值操作。
解决方法:
1.成员属性和我们传入的形参名称不要同名。
2.使用this指针。
如何使用this指针呢?
代码如下:
#include <iostream>
using namespace std;class Person {public:Person(int age) {//this指针指向的是被调用成员函数所属对象this->age = age;}int age;};//1.解决名称冲突void test01() {Person p1(18);cout << "p1的年龄为:" << p1.age << endl;}
//2.返回对象本身用*thisint main() {test01();return 0;
}
此时编译器就这样认为了,所以就解决了这个问题。
2、返回对象本身用*this
首先先看这样一段代码:
#include <iostream>
using namespace std;class Person {public:Person(int age) {this->age = age;}int age;void PersonADDAge(Person &p) {this->age += p.age;}};//1.解决名称冲突//void test01() {
// Person p1(18);
// cout << "p1的年龄为:" << p1.age << endl;
//
//}
//2.返回对象本身用*thisvoid test02() {Person p1(10);Person p2(10);p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年龄为:" << p2.age << endl;}int main() {
// test01();test02();return 0;
}
我们的目的是让p2加3次p1的年龄,想要的p2年龄返回结果为40,可编译器报错,这是为什么呢?
因为我们第一次调用PersonADDAge这个函数后,返回的是void,所以就不能再调用这个PersonADDAge函数了,那如果我们可以让第一次调用这个函数后的返回值仍然是p2,那就可以再次调用这个函数,那我们要如何实现呢?
使用this指针。
代码如下:
#include <iostream>
using namespace std;class Person {public:Person(int age) {this->age = age;}int age;//如果要返回本体,要用引用的方式返回。Person &PersonADDAge(Person &p) {this->age += p.age;//this指向p2的指针,而*this指向的就是p2这个对象本体。return *this;}};//1.解决名称冲突//void test01() {
// Person p1(18);
// cout << "p1的年龄为:" << p1.age << endl;
//
//}
//2.返回对象本身用*thisvoid test02() {Person p1(10);Person p2(10);//链式编程思想p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年龄为:" << p2.age << endl;}int main() {
// test01();test02();return 0;
}
此时的结果就是40了。
那为什么要用引用呢?
引用指向本身内存,不用引用就是拷贝了,而拷贝指向另一个内存。
这里返回的不是指针或者引用,因为前面加了,所以返回的是p2本体。*
这个时候我们把这个引用删除,看看结果又是多少?
结果为:20
为什么呢?
因为此时返回的是一个拷贝的数据,每一次返回都是一个新的对象。
所以最后就第一次调用对真正的p2产生影响,所以结果为20