АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Использование указателя this. Доступ к компонентным данным через указатель this. Использование this для возврата значений

Читайте также:
  1. Access.conf : файл доступа к серверу
  2. III Общий порядок перемещения товаров через таможенную границу Таможенного союза
  3. А) ИСПОЛЬЗОВАНИЕ КАТЕГОРИИ ВИДА В РУССКОМ ЯЗЫКЕ
  4. А) плечевой пояс проходит через грудную клетку; б) характерны анальные пузыри; в) зубы преобразовались в роговые пластины; г) уплощенные и широкие ребра.
  5. А. Стекание тока в землю через одиночные заземлители
  6. Административная ответственность за нарушения прав на использование информацией
  7. Адресна доступність
  8. Алекс встал перед съёмочной группой, надел ремень гитары через голову и поставил руку на струны.
  9. Алфавитный указатель
  10. Алфавитный указатель
  11. Алфавитный указатель
  12. Алчность не может превратиться в не-алчность; через алчность нужно переступить. Вы не можете изменить ее.

Указатель 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. За-
тем печатаются их адреса с помощью метода reveal(). Этот метод просто выводит
значение указателя this. Вот как это выглядит на экране:

Мой адрес - не дом и не улица, мой адрес - 0x8f4effec
Мой адрес - не дом и не улица, мой адрес - 0x8f4effe2
Мой адрес - не дом и не улица, мой адрес - 0x8f4effd8

 

Так как данные объектов хранятся в массивах, размер каждого из которых равен 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 мы никак не могли решить проблему возврата объекта из функции по ссылке, потому что объект был локальный по отношению к возвращающей функции и, следовательно, уничтожался во время выхода из функции. Нам необходим был более долговечный объект, чтобы возвращать результат по ссылке. Объект, чьим методом является данная функция,
прочнее, нежели его собственные методы. Методы объекта создаются и уничтожаются при каждом вызове, в то время как сам объект может быть удален только извне (например, по delete). Таким образом, возврат по ссылке результата работы функции, являющейся методом данного объекта, является более профессиональным решением, чем возврат объекта, созданного данным методом. Проще говоря, будет лучше, если объект включен в метод, потому что в таком случае этот объект и возвращается в результате работы своего метода в вызывающую программу. Раньше у нас было наоборот —в методе содержался объект, который возвращался в вызывающую программу,
но в результате того, что локальный объект при выходе из функции подлежит удалению, мы не могли передать его по ссылке. Новый подход очень легко осуществляется с помощью указателя this.

Ниже приведен листинг программы 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=37
а3=37

Всякий раз, когда в нашей программе встречается знак равенства

аЗ = а2 = a1

запускается перегружаемая функция operator=(), которая выводит соответствующее сообщение. Все три объекта у нас имеют одно и то же значение. Обычно описанный выше метод с возвратом результата работы перегружаемого operator=() по ссылке используется для того, чтобы избежать создания никому не нужных дополнительных копий объекта.

 


1 | 2 | 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 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.)