欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。
目录
1、缘起
2、this 指针的用途
2.1、用途 1
2.1.1 解法 1
2.1.2 解法 2
2.2、用途 2
2.3、用途 3
3、总结
1、缘起
我们知道在 C++ 中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么,问题来了?这一块代码是如何区分哪个对象调用自己的呢?
C ++ 通过提供特殊的对象指针,this 指针,解决上述问题。this 指针指向被调用的成员函数所属的对象。 this 指针是隐含每一个非静态成员函数内的一种指针,this 指针不需要定义,直接使用即可。
2、this 指针的用途
2.1、用途 1
当形参和成员变量同名时,可用 this 指针来区分,解决名称冲突。
示例代码 1:
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(int age)
{
age = age;
}
int age;
};
int main()
{
Person p(18);
cout << "年龄:" << p.age << endl;
cout << endl;
system("pause");
return 0;
}
从上述代码和结果图中可以看出,当成员变量和形参相同时,对象 p 调用成员变量 age 时输出了一个乱码,并且编译器给出了一个警告,这说明了成员变量和形参不能相同。
在编辑器中,当我们把鼠标放在形参 age 上时,构造函数 Person() 中的三个 age 都显示了阴影区域,这说明了这三个 age 是相同的。
作为对照,把鼠标放在成员变量 age 上,只有成员变量的 age 显示了阴影区域,而构造函数中的 age 没有显示阴影区域,这说明了成员变量的 age 和 构造函数中的 age 不是同一份数据。所以,当给成员变量 age 赋值时,会出现赋值不成功。编译器同时也会报一个警告:
警告 C26495 未初始化变量 Person::age。始终初始化成员变量(type.6)。
2.1.1 解法 1
对于上述报错问题,这里给出了第一种解法:就是给形参和成员变量取不同的名字。
示例代码 :
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(int age)
{
m_age = age;
}
int m_age;
};
int main()
{
Person p(18);
cout << "年龄:" << p.m_age << endl;
cout << endl;
system("pause");
return 0;
}
2.1.2 解法 2
对于上述报错问题,这里也给出了第二种解法:使用 this 指针。this 指针指向的是被调用的成员函数所属的对象。这里 this 指针指向构造函数中的变量 age ,这说明了这个变量 age 就属于对象 p 了,成员变量 age 从而和形参进行了区分,这时就可以给成员变量 age 赋值成功。
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(int age)
{
this -> age = age;
}
int age;
};
int main()
{
Person p(18);
cout << "年龄:" << p.age << endl;
cout << endl;
system("pause");
return 0;
}
2.2、用途 2
在类的非静态成员函数中返回对象的本身,可使用 return *this。
示例代码 :
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(int age)
{
this->age = age;
}
Person& personAddAge(Person& p1)
{
this->age += p1.age;
//this 指向 p2 的指针,而 *this 指向的就是 p2 这个对象本体
return *this;
}
int age;
};
int main()
{
Person p1(10);
Person p2(10);
p2.personAddAge(p1).personAddAge(p1).personAddAge(p1).personAddAge(p1);
cout << "p2 的年龄:" << p2.age << endl;
cout << endl;
system("pause");
return 0;
}
在C++中,类的非静态成员函数中返回对象本身,意味着函数返回的是当前对象的一个副本或引用。这种用法允许我们在一个连续的操作序列中对同一个对象进行多个操作。
2.3、用途 3
在成员函数中访问其他成员函数:
示例代码:
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
void displayInfo1()
{
cout << "姓名:" << m_name << " ";
cout << "年龄:" << m_age << " ";
//使用 this 指针调用成员函数
this->displayInfo2();
}
void displayInfo2()
{
cout << "住址:" << m_addr << endl;
}
string m_name = "胡图图";
int m_age = 7;
string m_addr = "翻斗大街翻斗花园二号楼 1001 室";
};
int main()
{
Person p;
p.displayInfo1();
cout << endl;
system("pause");
return 0;
}
3、总结
在C++中,this指针是一个隐含的指针,指向当前对象的地址。它可以在成员函数内部使用,用于引用调用该函数的对象自身。以下是关于this指针的用法总结。
① 区分成员变量和局部变量:当成员变量与局部变量同名时,使用 this 指针可以明确指示成员变量。这样可以避免命名冲突并确保正确引用。
② 在成员函数中访问其他成员函数:this 指针允许在一个成员函数中调用同一对象的其他成员函数。
③ 在类的非静态成员函数中返回对象的本身:在C++中,类的非静态成员函数中返回对象本身,意味着函数返回的是当前对象的一个副本或引用。这种用法允许我们在一个连续的操作序列中对同一个对象进行多个操作。
今天的分享总结就到这里了,如果有疑问的小伙伴,我们在评论区交流嗷~~~,笔者必回,我们下期再见啦 !!