C++中为什么需要this指针

C++中为什么需要this指针

对于 Stock 类,还有很多工作要做。到目前为止,每个类成员函数都只涉及一个对象,即调用它的对象。但有时候方法可能涉及到两个对象,在这种情况下需要使用C++的 this 指针。虽然 Stock 类声明可以显示数据,但它缺乏分析能力。例如,从show() 的输出我们可以知道持有的哪一支股票价格最高,但由于程序无法直接访问total_val,因此无法作出判断。要让程序知道存储的数据,最直接的方式是让方法返回一个值。为此,通常使用内联代码,如下例所示:

class Stock
{
private:
	...
    double total val;
	...
public :
    double total() const { return total_val;}
	...
};

就直接程序访问而言,上述定义实际上是使total val 为只读的。也就是说,可以使用方法 total val() 来获得 total _val 的值,但这个类没有提供专门用于重新设置 total val 的值的方法(作为一种副产品,其他方法,如 buy()、sel()和 update() 确实在重新设置成员 shares 和 share_val 的值的同时修改了 total_val 的值)。通过将该函数添加到类声明中,可以让程序查看一系列股票,找到价格最高的那一支。然而,可以采用另一种方法–一种帮助您了解 this 指针的方法。这种方法是,定义一个成员函数,它查看两个 Stock 对象,并返回股价较高的那个对象的引用。实现这种方法时,将出现一些有趣的问题,下面就来讨论这些问题。参见【0voice C++】

首先,如何将两个要比较的对象提供给成员函数呢?例如,假设将该方法命名为 topval(),则函数调用 stock1.topval() 将访问 stock1 对象的数据,而 stock2.topval() 将访问 stock2 对象的数据。如果希望该方法对两个对象进行比较,则必须将第二个对象作为参数传递给它。出于效率方面的考虑,可以按引用来传递参数,也就是说,topval()方法使用一个类型为const Stock &的参数。其次,如何将方法的答案传回给调用程序呢?最直接的方法是让方法返回一个引用,该引用指向股价总值较高的对象。因此,用于比较的方法的原型如下:

const Stock &topval(const Stock & s) const;

该函数隐式地访问一个对象,而显式地访问另一个对象,并返回其中一个对象的引用。括号中的 cons表明,该函数不会修改被显式地访问的对象;而括号后的const表明,该函数不会修改被隐式地访问的对象。由于该函数返回了两个 const对象之一的引用,因此返回类型也应为const引用。假设要对 Stock 对象 stock1和 stock2 进行比较,并将其中股价总值较高的那一个赋给 top 对象,则可以使用下面两条语句之一:

top = stockl.topval(stock2);
top = stock2.topval(stock1);

第一种格式隐式地访问 stock1,而显式地访问 stock2;第二种格式显式地访问 stockl,而隐式地访问stock2(参见图10.3)。无论使用哪一种方式,都将对这两个对象进行比较,并返回股价总值较高的那一个对象。

实际上,这种表示法有些混乱。如果可以使用关系运算符>来比较这两个对象,将更为清晰。可以使用运算符重载(参见第11章)完成这项工作。
同时,还要注意的是topval()的实现,它将引发一个小问题。下面的部分实现强调了这个问题:

const Stock & Stock::topval(const Stock & s)const
{
    if (s.total_val > total_val)
        return s;     //argument object
    else
        return ?????; //invoking object
}

其中,s.totalval 是作为参数传递的对象的总值,totalval是用来调用该方法的对象的总值。如果s.total val大于 toatl val,则函数将返回指向s的引用;否则,将返回用来调用该方法的对象(在OOP中,是topval消息要发送给的对象)。问题在于,如何称呼这个对象?如果调用stockl.topval(stock2),则s是stock2的引用(即stock2的别名),但 stock1 没有别名。
C++解决这种问题的方法是:使用被称为this的特殊指针。this 指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法)。这样,函数调用stock1topval(stock2)将this设置为 stock1 对象的地址,使得这个指针可用于topval()方法。同样,函数调用 stock2.topval(stockl)将 this 设置为 stock2 对象的地址。一般来说,所有的类方法都将this 指针设置为调用它的对象的地址。确实,topval()中的total_val 只不过是this->total val的简写(使用->运算符,通过指针来访问结构成员。这也适用于类成员)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值