Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конструкторы и деструкторы.doc
Скачиваний:
24
Добавлен:
18.04.2015
Размер:
184.83 Кб
Скачать

Указатель this

Каждый раз при создании объекта класса строится указатель, называемый this, и содержащий адрес этого объекта. Правильнее сказать , указатель определяется не в момент создания объекта , а в момент вызова любого из методов объекта.

В связи с неявным определением thisявляется константным указателем, т.е. по умолчанию происходит определение:

имя класса *const this = адрес обрабатываемого объекта

При работе с компонентами класса можно использовать указатель this

Эквивалентно:

Class point { int x, y ; Class point { int x, y ;

public: public:

point( int xx=0, int yy=0) point( int xx=0, int yy=0)

{this-> x=xx ; this ->y =yy ;} ; { x=xx ; y =yy ;} ;

Void print ( void) void print ( void)

{ cout<< this->x <<” “ << this->y;} ; {cout<< x <<” “ <<y;} ;

} }

В таком использовании нет никаких преимуществ.

Иногда используется при конфликте имен , когда имена формальных параметров функций совпадают с именами компонентов класса:

Class point { int x, y ; Class point { int x, y ;

public: public:

point( int x=0, int y=0) point( int x=0, int y=0)

{this-> x=x ; this ->y =y ;} ; { point::x=x ; point::y =y ;} ;

// используя this // используя квалифицированное имя

Часто в функциях- членах класса параметры функции имеют объект некоторого класса ( или указатель на объект) , а объект еще не существует. Для этого также используется указатель this, обозначающий указатель на тот объект, для которого вызывается данная функция .

Class A

{ int x, y ;

public:

A ( int xx=0, int yy =0){ x=xx ; y = yy; }

A func ( ) ;

}

A A :: func( ) { if ( x%2) x++; // функцияx преобразующая в четное

return * this;

}

Void main ()

{ A a1 (17, 55)

A a2 = a1 . func ();

}

/* Можно объявить так

A* A:: func ( )

{ …

return this} */

Чаще всего this используется при организации связанных списков, звеньями которых должны быть объекты класса и встает необходимость включать в связи указатель на тот объект, который в данный момент обрабатывается

Пример: Очередь

#include <iostream.h>

#include<stdio.h>

Class que

{ static que*first ; // указатель(адрес)первого элемента очереди

que*next ; // указатель на следующий элемент очереди

char bukva; //содержимое элемента очереди

public: // общедоступные функции

que(char c) { bukva = c } ; // конструктор

void add (void) ; //функция добавления элемента в очередь

static void print (void); // вывод содержимого очереди

}

// определения функций: