C++ this 指针作用笔记
1:解决名称冲突
–
当形参和成员变量同名时,可用this指针来区分
##在C++类中我们编写成员函数过程中,我们通常会将类中的属性名(例 int age)与构造函数或成员函数中的参数名做区分,以避免形参名与属性名相同而带来程序运行的错误。this指针的作用之一及解决了我们如果遇到形参名与属性名相同怎么办的问题。
##当我们不用this指针时,如果这样写出代码(错误示例)
class person2 {
public:
person2(int age) {
age = age;//???????????????错误展示
}
int age;
};
void test2() {
person2 p1(18);
cout << "p1的年龄为:" << p1.age << endl;
}
此时运行程序我们会发现,程序结果我们不能得到正确值,结果如图所示
当加入this指针后,正确程序如下:
#include<iostream>
using namespace std;
//this 指针:1、解决名称冲突
class person2 {
public:
person2(int age) {
//1、解决名称冲突
//this指针指向 被调用的成员函数 所属的对象(这里即为this指向对象p1,即this->age==》p1.age)
this->age = age;
int age;
};
void test2() {
person2 p1(18);
cout << "p1的年龄为:" << p1.age << endl;
}
main函数
int main() {
test2();
system("pause");
return 0;
}
在上例中 我们知道理解 this是指向 被调用的构造函数 所属的对象 的指针(这里即为this指向对象p1,即this->age==>p1.age)
2:返回对象本身
–
***在类的非静态成员函数中返回对象本身
这一功能主要可以用于链式编程,这里主要是讲解类中函数使用person2 *与person2 &的区别。
这里只放类和函数,主函数与上面相同。如下:
———
使用person2*
class person2 {
public:
person2(int age) {
//1、解决名称冲突
//this指针指向 被调用的成员函数 所属的对象(这里即为this指向对象p1,即this->age==》p1.age)
this->age = age;
}
person2* personaddage(person2 *p) { //person* 类型对应 return this
this->age += p->age;
//this指向p2(本代码所建立对象,在下面函数test22中)的指针,而*this指向的就是p2这个对象本体
return this;
}
int age;
};
void test22() {
person2 p2(10);
person2 p3(10);
person2* o=NULL;
p3.personaddage(&p2);
cout << "p3的年龄为:" << p3.age << endl;
/*链式编程思想
o=(*((*(p3.personaddage(&p2))).personaddage(&p2))).personaddage(&p2);
相当于o = this, this指针指向 被调用的成员函数 所属的对象, this指向p3
p3.personaddage(&p2)运行完毕后返回this,this是指向p3的,所以相当于返回的是一个指向p3的指针
*(p3.personaddage(&p2))对指针this解引用,相当于p3本身
(*(p3.personaddage(&p2))).personaddage(&p2),再次访问函数,此时运行完毕后返回this,this是指向p3的,
所以相当于返回的是一个指向p3的指针
*((*(p3.personaddage(&p2))).personaddage(&p2))对指针this解引用,相当于p3本身
(*((*(p3.personaddage(&p2))).personaddage(&p2))).personaddage(&p2)再次访问函数,此时运行完毕后返回this
因此o=(*((*(p3.personaddage(&p2))).personaddage(&p2))).personaddage(&p2)的含义为
运用this指针对p3进行三次函数调用,最后返回的结果是this指针,令指针this赋值给指针o
相当于指针o也是指向对象p3的指针
*/
o=(*((*(p3.personaddage(&p2))).personaddage(&p2))).personaddage(&p2);
cout << "p3的年龄为:" << p3.age << endl;
cout << "p3的年龄为:" << o->age << endl;
}
使用 person &
class person22 {
public:
person22(int age) {
//1、解决名称冲突
//this指针指向 被调用的成员函数 所属的对象(这里即为this指向对象p1,即this->age==》p1.age)
this->age = age;
}
person22& personaddage(person22* p) { //person22&对应return *this
this->age += p->age;
//this指向p2的指针,而*this指向的就是p2这个对象本体
return *this;
}
int age;
};
void test222() {
person22 p2(10);
person22 p3(10);
person22* o = NULL;
p3.personaddage(&p2); //此处p3.age=20
cout << "p3的年龄为:" << p3.age << endl;
//链式编程思想
/*
p3.personaddage(&p2)运行完毕后返回*this,这里*this即p3
因为 personaddage(person22* p) 的返回类型为person22&
所以 定义一个对象 person22& x=p3.personaddage(&p2),也就是说x为p3的别名
故 p3=p3.personaddage(&p2)
*/
p3.personaddage(&p2).personaddage(&p2).personaddage(&p2); //此处p3.age=50
cout << "p3的年龄为:" << p3.age << endl;
}
两者运行结果,都是p3.age=50;