每个类成员函数都只涉及一个对象,即调用它的对象。但有时候可能涉及两个对象,这种情况下需要使用C++的this指针。
到底怎么使用this指针呢,请看下面这个示例:
class Student//学生类
{
private:
string name;//姓名
int grade;//成绩
};
这有一个学生类,私有成员包括name和grade 。
接着,创建了两个对象stu1,stu2。并对它们进行了初始化。
string s = "花花";
string s1 = "瓜瓜";
Student stu1(s,90);//创建一个stu1对象,并用提供的数据初始化
Student stu2(s1, 91);
现在我想找出这两个对象中成绩更高的那个,并把它打印出来。
因此我们需要定义一个比较函数来比较这两个对象的成绩,可是问题来了,类成员函数只涉及一个对象,即为调用它的对象。比如:
stu1.comgrade()将访问stu1对象的数据 ; stu2.comgrade()将访问将访问stu2的对象的数据。
如果希望该方法对两个对象进行比较,则必须将第二个对象作为承诺书传递给它。处于效率考虑,我们按引用来传递参数,也就是说 comgrade()方法使用一个类型为const Student &的参数。
其次,怎么将方法答案传递传回调用程序呢?最直接的方法是返回一个引用,该引用指向成绩更高的对象。因此,这个函数原型如下:
const Student & comgrade(const Student & s) const;
假设要比较stu1 , stu2 这两个对象,并且成绩更高的那个对象赋给max对象,可以使用以下这两个语句
max=stu1.comgrade(stu2);
max=stu2.comgrade(stu1);
无论使用哪个语句,都将对这两个对象进行比较,并将返回成绩更高的那一个对象。下面来看一下该函数的实现。
const Student & Student:: comgrade(const Student& s) const
if (s.grade > grade)
return s;
else
return ???;
}
假设使用上面的第一条语句,那么s是stu2的别名/引用,但stu1没有别名。
那么这时候this指针就发挥作用了。
this指针指向用来调用成员函数的对象(this作为隐藏参数传递给方法)。
在这里this指向stu1,this设置为stu1的地址。
然而要返回的并不是地址this,而是对象本身,即*this。现在可以将*this作为调用对象别名来完成前面的定义。
const Student & Student:: comgrade(const Student& s) const
{
if (s.grade > grade)
return s;
else
return *this;
}
提醒:返回类型为引用意味着返回的是调用对象本身,而不是副本。