我们知道在C++中成员变量和成员函数是分开存储的
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
那么问题是:这一块代码是如何区分那个对象调用自己的呢?
C++通过提供特殊的对象指针,this指针,解决上述问题。
this指针指向被调用的成员函数所属的对象。
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
this指针的用途:
当形参和成员变量同名时,可用this指针来区分
在类的非静态成员函数中返回对象本身,可使用return*this
例如p1调用成员函数,则内部this指向p1,p2调用则this指针指向p2,以此类推。
注意:this本质上是个指针,谁调用就指向谁,所以可以解引用*this,也就是解引用成本体。
贴上代码:
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
int age1;
string name1;
Person(int age1, string name1)
{
age1 = age1; //默认传入的age1三个都是一样的
name1 = name1; //默认传入的name1三个都是一样的
}
};
class People
{
public:
int age2;
string name2;
People() //空的构造函数
{
}
People(int age2, string name2)
{
this->age2 = age2; //this指针指向调用这个函数的对象,this指针再给这个对象的age2赋值
this->name2 = name2; //解释同上
}
People& PersonAddAge(People p) //为了能返回本体,必须用Person&
{
//this指针是指向调用这个函数的对象,就是下文的p4,而*this就是解引用成p4本体
this->age2 += p.age2; //this这个指针的age2+上传入的形参的age
return *this; //this指针解引用成本体对象,就是下文的p4
}
};
void test01()
{
cout << "01是错误示范,传入的形参在构造函数里,并没有赋值给外部声明变量" << endl;
Person p1(1, "ZHLC");
cout << "01的age为" << p1.age1 << endl;
cout << "01的name为" << p1.name1 << endl;
cout << endl;
}
void test02()
{
cout << "02是正确示范,通过this指针把传入的形参赋给外部声明变量" << endl;
People p2(2, "zhlc");
cout << "02的age为" << p2.age2 << endl;
cout << "02的name为" << p2.name2 << endl;
cout << endl;
}
void test03()
{
cout << "接下来是链式编程" << endl;
People p3;
p3.age2 = 3;
People p4;
p4.age2 = 4;
p4.PersonAddAge(p3).PersonAddAge(p3).PersonAddAge(p3).PersonAddAge(p3).PersonAddAge(p3);
cout << "p3的age为" << p4.age2 << endl;
}
int main()
{
test01();
test02();
test03();
system("pause");
}
注释有写,看注释看的明白~