this指针是作用于成员函数的指针,是成员函数的隐含参数。所以我们通常用this指针在成员函数内部指向调用对象。同时,this指针也是一个用于结局成员函数内部名称冲突的方法
class Role
{
public:
//int r_power;若定义int值时,不使用r_power便会造成内部名称冲突,导致最后输出结果出错
int power;
Role(int power)
{
//r_power = power; 如不使用this指针,就需要在前面加上x_的前缀以便区分
this->power = power;//若使用this指针则可以避免此问题
}
};
那么使用this指针与链式编程有什么关系呢?请看以下实例:
class Role
{
public:
Role(int power)
{
this->power = power;
}
void PersonAddPower(Role& p)
{
this->power += p.power;
}
int power;
};
void test01()
{
Role r1(20);
Role r2(10);
r2.RoleAddPower(r1);
cout << "r2的力量为:" << r2.power << endl;
cout << "r1的力量为:" << r1.power << endl;
}
这里我们可以轻易得出:
但是如果我们认为r2的的力量值还不够,要怎么办,我们会想到,在r2原本的基础上继续增加几次
r2.RoleAddPower(r1).RoleAddPower(r1).RoleAddPower(r1);
理论上,这样的写法能够使数字提高到70,但这样却会出现报错为“错误(活动) E0153 表达式必须具有类类型,但它具有类型 “void” ”,而解决方法就得把
void PersonAddPower(Role& p)
{
this->power += p.power;
}
改成
Role& RoleAddPower(Role& p)
{
this->power += p.power;
//this指向p2的指针,而*this指向的就是p2这个对象本体
return *this;
}
因为如果用值的方式返回,它会返回新的对象,用引用则不会。
完整代码:
class Role
{
public:
Role(int power)
{
this->power = power;
}
Role& RoleAddPower(Role& p)
{
this->power += p.power;
return *this;
}
int power;
};
void test01()
{
Role r1(20);
Role r2(10);
r2.RoleAddPower(r1).RoleAddPower(r1).RoleAddPower(r1);
cout << "r2的力量为:" << r2.power << endl;
cout << "r1的力量为:" << r1.power << endl;
}
这样就构成了最简单的链式编程。