4.3.4this指针的概念
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象公用一块代码。
那么问题是:这一块代码是如何区分那个对象调用的是自己的呢?
C++通过提供特殊的对象指针,this指针,解决上述问题。
this指针指向被调用函数的成员函数所属的对象。
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可。
this指针的用途是;
1:当形参和实参变量名相同时,可以用this指针来区别。
2:在类的非静态成员函数中返回对象本身,可使用return *this。
示例:
#include<iostream>
using namespace std;
//this指针的作用
//1:解决名称冲突
//2:返回对象本身用 *this。
class Person
{
public:
Person(int age)
{
// age=age;//这种情况下会出现错误 即没有调用类中的成员 正确的需要使用this指针
this->age=age;/*这种情况是正确的 this指针指向的是被调用成员函数所属的对象。*/
}
// int m_Age;//这种命名规范 其中m代表成员 需要养成良好的命名习惯。
int age;
Person& PerAddPerson(Person p)//这里定义函数类型是需要加上引用符, 如果不加上的相当于返回 这个类的拷贝。
//如果是值的方式返回,返回的一定是一个新的对象,但如果用引用的方式返回他不会创建一个新的对象它会返回自己的本身。
{
this->age+=p.age;
}
};
void test()
{
Person p(18);
cout<<"p成员的年龄为:"<<p.age<<endl;
}
void test1()
{
Person p1(10);
Person p2(10);
//链式编程思想。
p2.PerAddPerson(p1).PerAddPerson(p1).PerAddPerson(p1).PerAddPerson(p1);
//这个原理和cout连续输出原理相同。
}
int main()
{
test();
return 0;
}
类的每一个成员函数的第一个参数都是隐藏的this指针
示例:
#include <iostream>
using namespace std;
class Student
{
public:
void InitStudent(char *name,char*gender,int age)
{
strcpy(_name,name);
stcpy(_gender,gender);
_age = age;
}
private:
char _name[20];
char _gender[5];
int _age = age;
};
int main ()
{
Student s1,s2;
s1.InitStudent("chan","nv",18);//在这里为什么只要进入这个初始化函数系统就知道你要初始化的是s1,为什么呢?这个时候我们就知道了原来在类的成员函数中有一个默认的隐含指针,this。
s2.InitStudent("xin","nan",21);
return 0;
}
所以上面那个函数参数加完整的话应该为
InitStudent(const *this,char*name,char*gender,int *age);
//这里面 const *this 是第一个参数 而*name是第二个参数。