C++ 类和对象 (6)this指针

        一般情况下,类中的成员函数在操作类中的一个对象,用这个类去创建一个对象,用对象去访问类的成员函数,无论怎么访问或操作,都是一个对象。但是有的时候类的成员函数可能会涉及两个对象,在这种情况下需要使用C++的this指针。

        假如,现在现在Stock类中新定义一个成员函数,它的作用是比较两个股票,并返回股价较高的那个对象的引用。此时就会产生几个问题:

        1.如何把两个要比较的对象提供给成员函数?

        假设将该成员函数topval(),则用stock1.topval()将访问stock1对象的数据,而stock2.topval()将访问stock2对象的数据。如果想用这个方法对两个对象进行比较,则必须将第二个对象作为参数传递给它。为了保证效率可以用引用来传递参数,也就是说,topval()方法使用一个类型为const Stock&的参数。

        2.怎么把成员函数的答案调回给程序?

        可以直接让成员函数返回一个引用,该引用指向股票较高的对象。例如

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

        该函数隐式地访问了一个对象,而显式地访问了另一个对象,并返回其中一个对象的引用。括号中的const表明,该函数不会修改被显式访问的对象;而括号后的const表明,该函数不会修改被隐式地访问的对象。由于该函数返回两个const对象之一的引用,因此返回类型也应为const引用。

        假设要对Stock对象stock1和stock2进行比较,并将股价总值高的那个赋值给top对象,则可以使用下面两条语句之一:

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

        实际上,这两条语句有点混乱,要是能使用关系运算符>来比较这两个对象,将更为清晰。可以使用运算符重载完成这项工作。

        同时,还要注意的是topval()的实现,它将引发一个小问题。下面的部分实现强调了这个问题:

const Stock & Stocl::topval(const Stock & s) const
{
    if(s.total_val>total_val)
        return s;
    else
        return ???;
}

        其中,s.total_val是作为参数传递的对象的总值,total_val是用来调用该方法的对象的总值。如果s.total_val大于total_val,则函数将返回指向s的引用,否则,将返回用来调用该方法的对象(在OOP中,时topval消息要发送给的对象)。问题在于,如何称呼这个对象?如果调用stock1.topval(stock2),则s是stock2的引用(即stock2的别名),但是stock1没有别名。

        C++解决这种问题的方法是:使用一个叫做this的特殊指针。this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给成员函数)。让函数调用stock1.topval(stock2)将this设置成stock1的地址,使得这个指针可以用于topval()方法。同样,函数调用stock2.topval(stock1)将this设置为stock2对象地址。一般来说,所有的类方法都将this指针设置为调用它的对象的地址。topval()中的total_val只不过是this->total_val的缩写。

Tips:每个成员函数(包括构造函数和析构函数)都有一个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;
}

        返回类型为引用意味着返回的是调用对象本身,而不是副本。

你可能感兴趣的:(c++,开发语言,c语言,linux,ubuntu,经验分享,学习)