如果 本类实例 与 同类另一实例 的元素 不加说明会发生混淆,则应以this指针指出本类实例的元素。
试以 全国计算机二级考试真考题库(未来教育)第20套第一道操作题的部分程序代码为例:
class Point{
double x,y;
public:
Point(double x=0.0, double y=0.0)
// **********found**********
double getX()const{ return x; }
double getY()const { return y; }
void show() const { cout << '(' << x << ',' << y << ')';}
};
问,要把Point(double x=0.0, double y=0.0)中的x和y赋值给本类实例的x和y,
则// **********found**********此处应写什么?
: x(x), y(y){}
这是使用初始化参数函数列表的写法。
显然就是使用()中传入的x去初始化本类的x,而y同理,()中的x,y显然来自于Point(double x, double y),只能这样理解,反过来理解是说不通的。我没有研究过这里初始化参数函数列表的具体设计原理,但不妨猜想一下:它设计为x()和y()所初始化的对象都是本类的x和y,而()中则默认来自构造函数的传参。
或
{this->x=x,this->y=y; }
这是定义构造函数内部的写法。
此时写{x=x, y=y;} 就会有歧义,x和y到底指的是谁呢?作者也许心里是明白的,但编译器不明白。这也难以事先设计。
因此需要用this来指出本类的x。
再比如同一套试卷第三道操作题:
IntSet IntSet::Intersection(IntSet& set)
{
int a[Max],size=0;
//********333********
//********666********
return IntSet(a,size);
}
求两个set的交集。(本类实例和引用传入实例)
可以这样写:
IntSet IntSet::Intersection(IntSet& set)
{
int a[Max],size=0;
//********333********
for (int i = 0; i <= this->GetEnd(); i++) {
for (int j = 0; j <= set.GetEnd(); j++) {
if (this->GetElement(i) == set.GetElement(j)) {
a[size++] = this->GetElement(i);
}
}
}
//********666********
return IntSet(a,size);
}
如果不用this指针和set.加以区分,则
IntSet IntSet::Intersection(IntSet& set)
{
int a[Max],size=0;
//********333********
for (int i = 0; i <= GetEnd(); i++) {
for (int j = 0; j <= GetEnd(); j++) {
if (GetElement(i) == GetElement(j)) {
a[size++] = GetElement(i);
}
}
}
//********666********
return IntSet(a,size);
}
GetEnd()和GetElement()势必不知所指,将会引起歧义和混淆!