1 this指针
this指针是一个特殊的指针,当类的某个非静态的成员函数在执行时,就会存在this指针。它指向类的一个对象,且这个对象的某个成员函数正在被调用。
this指针只能在一个类的成员函数中调用,它表示当前对象的地址。
注意:
1)this只能在成员函数中使用。
2)全局函数,静态函数都不能使用this。
如果想要实现一个这样的方法,定义一个成员函数,它查看两个Stock对象,并返回股票价较高的那个对象的引用。首先,如何将两个要比较的对象提供给成员函数呢?例如,假设将该方法命名为topval(),则函数调用stock1.topval()将返回stock1对象的数据,而stock2.topval()将访问stock2对象的数据。如果希望该方法对两个对象进行比较,则必须将第二个对象作为参数传递给它。出于效率方面的考虑,可以按引用来传递参数,也就是说,topval()方法是用一根类型为const Stock&的参数。
其次,如何将方法的答案传回给调用程序呢?最直接的方法是让方法返回一个引用,该引用指向股价总值较高的对象。因此,用于比较的方法的原型如下:
const Stock& topval(const Stock &是) const;
该函数隐式地访问一个对象,而显式地访问另一个对象,并返回其中一个对象的引用。括号中的const表明,该函数不会修改该显示地访问的对象;而括号后的const表明,该函数不会修改被隐式地访问的对象。由于该函数返回了两个const对象之一的引用,因此返回类型也应该为const引用。
const Stock &Stock::topval(condt Stock &s) const
{
if(s.total_val>total_val)
return s;
else
return ????;
}
如果s.total_val对于total_val,则函数将返回指向s的引用;否则,将返回调用该方法的对象。问题在于,如何称呼这个对象呢?如果调用stock1.topval(stock2),则s是stock2的引用,但stock1没有别名。
C++解决这种问题的方法是:使用被称为this的特殊指针。this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法)。这样,函数调用stock1.topval(stock2)将this设置为stock1对象的地址,使得这个指针可用于topval()方法。一般来说,所有的类方法都将this指针设置为调用它的对象的地址。
注意:每个成员函数(包括构造函数和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样讲不能使用this来修改对象的值。
然而,要返回的并不是this,因为this是对象的地址,而不是对象本身,即*this(将解除引用运算符*用于指针,将得到指针指向的值)。现在,可以将*this作为调用对象的别名来完成前面的方法定义。
const Stock &Stock::topval(const Stock &s) const
{
if(s.total_val>total_val)
return s;
else
return *this;
}
返回类型为引用意味着返回的是调用对象本身,而不是副本。
2 对象数组
const int STKS=4;
Stock stocks[STCKS]={
Stock("NanoSmart",12.5,20),
Stock("Boffo Objects",200,2.0).
Stock("Monolithic Oblisks",130,3.25),
Stock("Fleep Enterpriaes",60,6.5)
};
如果类包含多个构造函数,则可以对不同的元素使用不同的构造函数:
const int STKS=10;
Stock stocks[STKS]={
Stock("NanoSmart",12.5,20),
Stock(),
Stock("Monolithic Obelisks",130,3.25),
};
由于该声明只初始化了数组的部分元素,因此余下的7个元素将使用默认构造函数进行初始化。