虽然Stock类声明可以显示数据,但它缺乏分析能力。要让程序知道存储的数据, 最直接的方式是让方法返回一个值。为此,通常使用内联代码,如下例所示:
class Stock
{
private:
......
double total_val;
public:
double total()const{return total_val;}
}
就直接程序访问而言,上述定义实际上是使total_vai为只读的。也就是说,可以使用方法total_val() 来获得total_val的值,但这个类没有提供专门用于重新设置total_val的值的方法(作为一种副产品,其他方法,如buy( )、sell()和update()确实在重新设置成员shares和share_val的值的同时修改了total_val的值。
可以采用另一种方法——一种帮助您了解this指针的方法。这种方法是,定义一个成员函数,它查看两个Stock 对象,并返回其中一个对象的引用。实现这种方法时,将出现一些有趣的问题,下面就来讨论这些问题。
首先,如何将两个要比较的对象提供给成员函数呢?例如假设将该方法命名为topva(),则函数调用stock1.topva( )将访问stock1对象的数据,而stock2.topval()将访问stock2对象的数据。如果希望该方法对两个对象进行比较,则必须将第二个对象作为参数传递给它。出于效率方面的考虑,可以按引用來传递参数,也就是说,topval()方法使用一个类型为const Stock &的参数,
其次,如何将方法的答案传回给调用程序呢?最直接的方法是让方法返回一个引用。因此,用于比较的方法的原型如下:
const Stock & topval(const Stock & s) const;
该函数隐式地访问一个对象,而显式地访问另一个对象,并返回其中一个对象的引用。括号中的const 表明,该函数不会修改被显式地访问的对象:而括号后的const表明,该函数不会修改被隐式地访问的对象。由于该函数返回了两个const对象之一的引用,因此返回类型也应为const引用。
假设要对Stock对象stock1和stock2进行比较,并将其中较高的那一个赋给top对象,则可以使用下面两条语句之一:
top = stock1.topval(stock2);
top = stock2.topval(stock1);
第一种格式隐式地访问Stock1,而显式地访问Stock2:第二种格式显式地访问Stock1,而隐式地访问stock2 。无论使用哪一种方式,都将对这两令对象进行比较,并返较高的那一个 对象。
const Stock & Stock::topval(const Stock & s) const
{
if (s.total_val > total_val)
return s; // argument object
else
return *this; // invoking object
}