Главная->Інформатика та програмування->Содержание->Использование this для возврата значений

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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=() по ссылке используется для того, чтобы избежать создания ни-

кому не нужных дополнительных копий объекта.

 

27