C++中成员变量和成员函数是分开存储的
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共同使用一块代码
(即当很多对象调用同一个非静态成员函数时)
问题:这一块代码是如何区分哪个对象调用自己的呢?
C++通过提供特殊的对象指针,this指针,指向被调用的成员函数所属的对象
this指针是隐含每一个非静态成员函数内的一种指针
不需要定义,直接使用即可
this指针的用途:
- 当形参和成员变量同名时,可用this指针来区分(解决名称冲突)
- 在类的非静态成员函数中返回对象本身,可使用return *this
三个对象p1,p2,p3,都调用这个函数,那么就用this指针,说白了就是谁调用this指针就指向谁
举例:名称冲突:
修改:
class Person
{
public:
Person(int age)
{
//this指针指向被调用的成员函数所属的对象(即谁调用这个函数就指向谁)
this->age = age;
}
Person& PersonADD(Person &p)
{
this->age += p.age;//自身的年龄加上别人的年龄
//this是指向p2的指针,则*this就是P2本体
return *this;
}
int age;
};
//1,解决名称冲突
void test01()
{
Person p1(18);
cout << " p1的年龄为:" << p1.age << endl;
}
//2,返回对象本身用*this
void test02()
{
Person p1(10);
Person p2(10);
p2.PersonADD(p1).PersonADD(p1).PersonADD(p1);
cout << " p2的年龄为:" << p2.age << endl;
}
int main() {
//test01();
test02();
system("pause");
return 0;
}
注意:p2.PersonADD(p1).PersonADD(p1).PersonADD(p1);这一句之所以可以链式,是因为:
Person& PersonADD(Person &p)
这一句中,按引用传参,传递的是对象别名,也就相当于传递了对象本身。
而返回时按引用返回,返回的也是对象本身,此时不会发生拷贝。
如果按值返回,返回时将拷贝临时副本到函数调用点,然后释放空间。