С++ для начинающих



         

Неявный указатель this - часть 2


Понять все это можно, если представить себе, как компилятор реализует объект this. Для его поддержки необходимо две трансформации:

1.      Изменить определение функции-члена класса, добавив дополнительный параметр:

// псевдокод, показывающий, как происходит расширение

// определения функции-члена

// ЭТО НЕ КОРРЕКТНЫЙ КОД C++

inline void Screen::move( Screen *this, int r, int c )

{

   if ( checkRange( r, c ) )

   {

      int row = (r-1) * this->_width;

      this->_cursor = row + c - 1;

   }

}

В этом определении использование указателя this для доступа к членам _width и _cursor сделано явным.

2.      Изменение каждого вызова функции-члена класса с целью передачи одного дополнительного аргумента – адреса объекта, для которого она вызвана:

myScreen.move( 2, 2 );

транслируется в

move( &myScreen, 2, 2 );

Программист может явно обращаться к указателю this внутри функции. Так, вполне корректно, хотя и излишне, определить функцию-член home() следующим образом:

inline void Screen::home()

{

   this->_cursor = 0;

}

Однако бывают случаи, когда без такого обращения не обойтись, как мы видели на примере функции-члена copy() класса Screen. В следующем подразделе мы рассмотрим и другие примеры.




Содержание  Назад  Вперед