• [C/C++] C++ this 指针详解 [ c++中文网 ]


    在前面曾经提到过: 每个对象中的数据成员都分别占有存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间以存放n个对象中的数据成员。但是,不同对象都调用同一个函数代码段。

    那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所指定的对象的数据成员呢?假如,对于例9.6程序中定义的Box类,定义了3个同类对象a,b,c。
    如果有a.volume( ) ,应该是引用对象a中的height,width和length,计算出长方体a的体积。
    如果有b.volume( ) ,应该是引用对象b中的height,width和length,计算出长方体b的体积。

    而现在都用同一个函数段,系统怎样使它分别引用a或b中的数据成员呢?在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this指针。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。

    例如,当调用成员函数a.volume时,编译系统就把对象a的起始地址赋给this指针,于是在成员函数引用数据成员时,就按照this的指向找到对象a的数据成员。例如volume函数要计算height*width*length的值,实际上是执行:
       (this->height)*(this->width)*(this->length)
    由于当前this指向a,因此相当于执行:
       (a.height)*(a.width)*( a.length)
    这就计算出长方体a的体积。

    同样如果有b.volume( ) ,编译系统就把对象b的起始地址赋给成员函数volume的this指针,显然计算出来的是长方体b的体积。this指针是隐式使用的,它是作为参数被传递给成员函数的。
    本来,成员函数volume的定义如下:
    int Box::volume( )
    {
       return (height*width*length);
    }
    C++把它处理为
    int Box::volume(Box *this)
    {
       return (this->height * this->width * this->length);
    } 即在成员函数的形参表列中增加一个this指针。
    在调用该成员函数时,实际上是用以下方式调用的:
       a.volume(&a);
    将对象a的地址传给形参this指针。然后按this的指向去引用其他成员。

    需要说明: 这些都是编译系统自动实现的,编程序者不必人为地在形参中增加this指针,也不必将对象a的地址传给this指针。在需要时也可以显式地使用this指针。

    例如在Box类的volume函数中,下面两种表示方法都是合法的、相互等价的。
       return (height * width * length); //隐含使用this指针
       return (this->height * this->width * this->length); //显式使用this指针
    可以用*this表示被调用的成员函数所在的对象,*this就是this所指向的对象,即当前的对象。

    例如在成员函数a.volume( )的函数体中,如果出现*this,它就是本对象a。上面的return语句也可写成
       return((*this).height * (*this).width * (*this).length);

    注意*this两侧的括号不能省略,不能写成*this.height。

    所谓“调用对象a的成员函数f”,实际上是在调用成员函数f时使this指针指向对象a,从而访问对象a的成员。在使用“调用对象a的成员函数f”时,应当对它的含义有正确的理解。
  • 相关阅读:
    MFC Windows 程序设计>WinMain 简单Windows程序 命令行编译
    AT3949 [AGC022D] Shopping 题解
    CF643D Bearish Fanpages 题解
    CF643C Levels and Regions 题解
    CF241E Flights 题解
    CF671C Ultimate Weirdness of an Array 题解
    CF1592F Alice and Recoloring 题解
    GYM 102452E 题解
    CF494C Helping People 题解
    P5556 圣剑护符
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786724.html
Copyright © 2020-2023  润新知