|
Программирование >> Программирование на языке c++
Когда объявляется объект 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& М)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |