C++this指针的用途

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.返回对象本身用*this

int 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.返回对象本身用*this

int 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.返回对象本身用*this

void 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.返回对象本身用*this

void 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

猜你喜欢

转载自blog.csdn.net/m0_51955470/article/details/113124746