ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн
Использование this для возврата значений
Более практичным применением указателя this является возврат значений из ме-
тодов и перегружаемых операций в вызывающую программу.
Вспомните, что в программе ASSIGN мы никак не могли решить проблему
возврата объекта из функции по ссылке, потому что объект был локальный по
отношению к возвращающей функции и, следовательно, уничтожался во время
выхода из функции. Нам необходим был более долговечный объект, чтобы воз-
вращать результат по ссылке. Объект, чьим методом является данная функция,
прочнее, нежели его собственные методы. Методы объекта создаются и уничто-
жаются при каждом вызове, в то время как сам объект может быть удален толь-
ко извне (например, по delete). Таким образом, возврат по ссылке результата
работы функции, являющейся методом данного объекта, является более про-
фессиональным решением, чем возврат объекта, созданного данным методом.
Объясним чуть более простыми словами: будет лучше, если в объект включен
метод, потому что в таком случае этот объект и возвращается в результате ра-
боты своего метода в вызывающую программу. Раньше у нас было наоборот —
в методе содержался объект, который возвращался в вызывающую программу,
но в результате того, что локальный объект при выходе из функции подлежит
удалению, мы не могли передать его по ссылке. Новый подход очень легко
осуществляется с помощью указателя this.
Ниже приведен листинг программы ASSIGN2, где функция operator=() возвра-
щает по ссылке тот объект, в который она включена.
Листинг 11.21. Программа ASSIGN2
//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=37
а3=37
Всякий раз, когда в нашей программе встречается знак равенства
аЗ = а2 = a1
запускается перегружаемая функция operator=(), которая выводит соответству-
ющее сообщение. Все три объекта у нас имеют одно и то же значение.
Обычно описанный выше метод с возвратом результата работы перегружа-
емого operator=() по ссылке используется для того, чтобы избежать создания ни-
кому не нужных дополнительных копий объекта.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
Схожі підручники
- Філософія Хрестоматія (частина 1)
- Товарознавство харчових продуктів функціонального призначення. Навчальний посібник (частина 1)
- Белая книга (частина 4) (онлайн)
- Фінансова діяльність суб'єктів підприємництва. Навчальний посібник (частина 1)
- Лекції з курсу “Політологія”
- Как загубить собственный бизнес (онлайн)
