Указатель this C++

Вместо того, чтобы сразу давать определение, что же это такое — указатель this, предлагаю рассмотреть вместе с вами два простейших примера. В одном мы просто определим две функции setData() и getData(). Одна будет предлагать пользователю ввести данные, вторая будет выводить их на экран соответственно. И обратимся к ним из главной функции main()А во втором примере, мы создадим класс class SetGetData, методы которого так же будут вносить данные и выводить их на экран. Забегая наперед, скажу, что основным отличием этих функций и методов станет то, как они принимают параметры (аргументы).

Первый пример:

#include <iostream>

using namespace std;

void setData(char *s, int &n) //функция для принятия данных
{
	cout << "Введите строку: ";
	cin.getline(s, 128);
	cout << "Введите целое число: ";
	cin >> n;		
}

void getData(char s[], int n) //отображение данных
{
	cout << "\n" << s << n << endl << endl;	
}

int main()
{
	setlocale(LC_ALL, "rus");

	char str[128] = ""; //объявляем и инициализируем переменные для очистки от мусора 
	int number = 0;

	setData(str, number); //вызов функций
		system("cls"); //очистка экрана перед выводом данных на экран
	getData(str, number); 

return 0;
}

Этот пример, скорей всего, не вызвал у вас никаких вопросов и трудностей в его понимании, если уж вы дошли до изучения этой темы. Тут мы определили две функции  — строки 5 — 16. Функция setData(char *s, int &n)  принимает два параметра: указатель на строку и адрес переменной типа int, для того чтобы внести изменения в переменные, которые ей передадутся при вызове. Функция getData(char s[], int n) отобразит строку и число, измененные пользователем. Далее в main-функции мы просто объявляем переменные и передаем их в наши функции при вызове.

Результатом работы будет, к примеру, такое сообщение:

CppStudio.com
                
cppstudio.com - site N1

Тут вот какое дело, если мы, при определении функций, не укажем, какие параметры им надо принять либо не передадим переменные в качестве параметров, при вызове функций — это будет крах программы.  Компилятор такого нам не простит — вы это понимаете

Теперь рассмотрим второй пример (Тут вы уже сразу обратите внимание на то, что мы не передаем параметры в методы ни при определении, ни при вызове методов):

#include <iostream>

using namespace std;

class SetGetData //определяем класс
{
	char str[128];
	int number;

public:
	void setData()  //метод класса, который принимает данные
	{
		cout << "Введите строку: ";
		cin.getline(str, 128);
		cout << "Введите целое число: ";
		cin >> number;	
	}

	void getData() //метод класса, который выводит данные на экран
	{
		cout << "\n" <<  str  << number << endl << endl;	
	}
};	

int main()
{
	setlocale(LC_ALL, "rus");

	SetGetData object; //создаем объект класса
	object.setData(); //вносим данные
		system("cls"); //очистка экрана перед выводом данных на экран
	object.getData(); //данные отображаем на экране 

return 0;
}

Вы видите, что явно мы ни при определении, ни при вызове методов через объект, не указываем с какими параметрами будут работать методы класса. Все дело в том, что при вызове методов, которые принадлежат классу, им неявно передается тот самый указатель this. Это происходит автоматически и незаметно для нас, так как он является скрытым первым параметром любого метода-элемента класса. Указатель this указывает на адрес созданного объекта класса — в нашем случае он получает адрес объекта object  и указывает методу setData() в какие элементы объекта надо внести измененные данные, а методу getData() —  элементы какого объекта надо  отобразить на экране.

Важно знать, что у нас есть возможность использовать указатель this явно. Так, к примеру, выглядело бы определение метода getData(), если бы мы использовали this явно:

	void getData() //метод класса, который выводит данные на экран
	{
		cout << "\n" << this->str  << this->number << endl << endl;	
	}

Такая запись так же «пройдет»:

    void getData() 
    {
        cout << "\n" <<  (*this).str  << (*this).number << endl << endl;//круглые скобки (*this) обязательны
    }

В обоих случаях можно обойтись без этого явного указания, но как это делается лучше знать по той причине, что указатель this  все же  используется программистами явно , в определенных случаях. Только это уже совсем другая тема. В данной статье мы лишь проходим по основам. 

Теперь можно и определение дать! Указатель this — это указатель на адрес объекта класса, при этом он  является скрытым первым параметром любого метода класса (кроме статических методов), а типом указателя выступает имя класса. И еще кое-что из теории:

  • this является зарезервированным словом С++;
  • мы можем использовать this явно в методах-элементах класса;
  • а вот явно объявить,  инициализировать  либо изменить указатель this, возможности нет;

Так, совсем коротко, мы дали вам основную информацию по этой теме. Остались вопросы? Задавайте их в комментариях к статье. Без ответа мы вас не оставим.

Практика

К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!

Автор: Marienko L.
Дата: 22.01.2014
Поделиться:

Комментарии

  1. wElenaFax

    Работа в интернете

  2. SymbianC

    Ну вобще статья само сабой хорош, а я б советовал б создать эл.книг автору, книга про С++ и все такое. А почему б нет?. Книга тож пособия учебник.. Ну эта мае мнение. А так я тож любител С++.

  3. Patrick

    Спасибо за статью!

    Хотелось бы конечно побольше инфы про явное использование указателя this. В каких случаях он используется явно, где его лучше использовать и т.п. и с примерами:)

    • DESergik

      Посмотри данную тему в книге Прата С. — Язык программирования С++. Лекции и упражнения — 2011. Там хороший пример на эту тему разобран ;)

      • Patrick

        Спасибо, посмотрю:)

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.