Программирование >>  Программирование на языке c++ 

1 ... 23 24 25 [ 26 ] 27 28 29 ... 159


Когда объявляется объект my object класса my class, то this получает значение указателя на объект my object (на область компьютерно!! памяти, где хранится вся информация об этом объекте). Таким образом, в приведенных выше объявлениях:

string strl; string str2;

любая функция, являющаяся компонентом объекта strl, имеет скрытый указатель this на объект strl (ниже будет показано, что некоторые функции не имеют такого указателя), а любая функция, являющаяся компонентом объекта str2, имеет скрытый указатель this на объект str2. В результате наша функция display string в действительности воспринимает приведенную выше инструкцию в виде:

cout this->str endl;

Однако такое явное задание указателя this можно опустить, что и сделано в рассмотренном выше примере. С другой стороны, явное использование этого указателя является эффективным во многих практических задачах.

Рассмотрим пример использования указателя this (в этом и последующих примерах после слова Результат: записывается то, что выводится на экран дисплея в соответствующих точках программы):

I Str2.displav stringQ:

string Slr2;


string strl;

Два разных указателя this хранят адреса своих объектов в памяти компьютера

Рис. 3.3. Указатель this - это скрытая внутренняя переменная объекта, объявленная в виде имя класса *const this; и указывающая на начало объекта в памяти компьютера (this - ключевое слово языка С++)



#include <iostream.h> class my class { int x,y; public:

void set(int X,int Y) { x=X; y=Y; } my class f(my class);

my class* ff(void) { x=y=100; return this; }

void displayO { cout x \t У endl; } }; my class my class::f(my class M) { x+=M.x; y+=M.y;

return *this; }

void main(void) { my class A,B;

A.set(10,20); ,

B.ff()->display(); Результат: 100 100 A.displayO; Результат: 10 20

A.f(B).display(); Результат: 110 120

В классе my class объявлены две функции: f и ff. Поскольку эти функции несколько отличаются от остальных функций, рассмотрим их более подробно. Функция ff имеет вид:

my class* ff(void) { х=у=100; return this; }

Она не имеет аргументов (void) и возвращает указатель на объект класса my class. Выражение return this; в теле функции как раз и возвращает указатель на тот объект, для которого вызвана эта функция. Поскольку ff описана в классе my class, то она и возвращает указатель на объект класса my class. Вызов этой функции

B.ff()->display();

интерпретируется следующим образом: -♦ сначала вызывается функция ff объекта В ( B.ff());

-♦ функция ff возвращает значение, которое является указателем на объект В;

вызывается функция display() объекта В через указатель на этот объект, т. е. используется конструкция



yкaзaтeль нa B вoзвpaщeнный ff -> display();

Операторы . и -> в выражении B.ff()->display() имеют одинаковый приоритет и выполняются слева направо.

Рассмотрим теперь функцию f:

my class my class::f(my class М)

{ х-1-=М.х; у-1-=М.у;

return *this; }

Она имеет один аргумент (М - объект класса my class) и возвращает объект класса my class. В выражении

х-1-=М.х;

значение аргумента х в объекте, для которого вызвана функция f, увеличивается на значение аргумента х, взятого из объекта М. Аналогичные действия выполняются и в выражении у+=М.у;. Функция f возвращает значение объекта, для которого она вызвана. Рассмотрим выражение

A.f(B).display();

Здесь выполняются такие действия:

вызывается функция f объекта А (A.f(B));

>- функция f возвращает значение, которое является объектом А;

-♦ вызывается функция display() объекта А через имя этого объекта, т. е. используется конструкция

oбъeкт A вoзвpaщeнный f.display();

Операторы . в выражении A.f(B).display() выполняются слева направо.

Когда функция f объявляется в виде my class f(my class); параметр класса my class является временным (он существует только в теле функции и уничтожается при заверщении функции). Когда параметры передаются в функцию, они помещаются в стековую память. В отличие от данных стандартных типов (int, float и т. п.) объекты часто требуют много больще памяти, в результате сильно увеличивается размер стека. Чтобы уменьшить размер стека в функцию можно передать не сам объект, а ссылку (его второе имя), например:

my class& my class::f(my class& М)



1 ... 23 24 25 [ 26 ] 27 28 29 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика