|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Использование указателя this. Доступ к компонентным данным через указатель this. Использование this для возврата значенийУказатель this Методы каждого объекта имеют доступ к некому волшебному указателю под на- // where.cpp // указатель this #include <iostream> using namespace std; /////////////////////////////////////////////////////////// class where { private: char charray[10]; //массив из 10 байтов public: void reveal() { cout << "\nМой адрес – не дом и не улица, мой адрес - " << this; } // вывести адрес объекта }; /////////////////////////////////////////////////////////// int main() { where w1, w2, w3; //создать три объекта w1.reveal(); //посмотреть, где они находятся w2.reveal(); w3.reveal(); cout << endl; return 0; } В функции main() данной программы создаются три объекта типа where. За- Мой адрес - не дом и не улица, мой адрес - 0x8f4effec
Так как данные объектов хранятся в массивах, размер каждого из которых равен 10 байтов, то объекты в памяти отделены друг от друга десятью байтами (EC-E2=E2-D8=10 (дес)). Впрочем, некоторые компиляторы могут творчески подойти к расположению объектов и выделить под каждый чуть больше, чем 10 байтов.
Доступ к компонентным данным через указатель this Когда вы вызываете какой-либо метод, значением указателя this становится адрес объекта, для которого этот метод вызван. Указатель this может интерпретироваться, как любой другой указатель на объект, соответственно, его можно использовать для получения доступа к данным объекта, на который он ссылается.
// dothis.cpp // как указатель this ссылается на данные #include <iostream> using namespace std; /////////////////////////////////////////////////////////// class what { private: int alpha; public: void tester() { this->alpha = 11; //то же,что alpha = 11; cout << this->alpha; //то же, что cout << //alpha; } }; /////////////////////////////////////////////////////////// int main() { what w; w.tester(); cout << endl; return 0; } Эта программа просто выводит на экран значение 11. Обратите внимание, каким образом метод tester() получает доступ к переменной alpha: this -> alpha Это точно то же самое, что прямая ссылка на alpha. Такой синтаксис обрабатывается без каких-либо проблем, но в нем на самом деле никакого иного смысла нет, кроме единственного — показать, что указатель this действительно ссылается на объект.
Использование this для возврата значений Более практичным применением указателя this является возврат значений из методов и перегружаемых операций в вызывающую программу. Вспомните, что в программе ASSIGN мы никак не могли решить проблему возврата объекта из функции по ссылке, потому что объект был локальный по отношению к возвращающей функции и, следовательно, уничтожался во время выхода из функции. Нам необходим был более долговечный объект, чтобы возвращать результат по ссылке. Объект, чьим методом является данная функция, Ниже приведен листинг программы ASSIGN2, где функция operator=() возвращает по ссылке тот объект, в который она включена //assign2.cpp // возврат содержимого указателя this #include <iostream> using namespace std; /////////////////////////////////////////////////////////// class alpha { private: int data; public: alpha() // конструктор без аргументов { } alpha(int d) // конструктор с одним аргументом { data = d; } void display() // вывести данные { cout << data; } alpha& operator = (alpha& a) // перегружаемая операция = { data = a.data; // не делается автоматически cout << "\nЗапущен оператор присваивания"; return *this; // вернуть копию this alpha } }; /////////////////////////////////////////////////////////// int main() { alpha a1(37); alpha a2, a3;
a3 = a2 = a1; // перегружаемый =, дважды cout << "\na2="; a2.display(); // вывести a2 cout << "\na3="; a3.display(); // вывести a3 cout << endl; return 0; } В этой программе можно использовать описатель alpha& operator = (alpha& а) использующий возврат по ссылке, вместо alpha operator = (alpha& а) возвращающего результат по значению. Последним выражением функции является return *this;
Так как this является указателем на объект, чей метод выполняется, то *this — это и есть сам объект, и вышеприведенное выражение возвращает его по ссылке. Вот результат работы программы ASSIGN2: Всякий раз, когда в нашей программе встречается знак равенства аЗ = а2 = a1 запускается перегружаемая функция operator=(), которая выводит соответствующее сообщение. Все три объекта у нас имеют одно и то же значение. Обычно описанный выше метод с возвратом результата работы перегружаемого operator=() по ссылке используется для того, чтобы избежать создания никому не нужных дополнительных копий объекта.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.) |