Вместо того, чтобы сразу давать определение, что же это такое — указатель 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 - 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, возможности нет;
Так, совсем коротко, мы дали вам основную информацию по этой теме. Остались вопросы? Задавайте их в комментариях к статье. Без ответа мы вас не оставим.
Комментарии
wElenaFax
Работа в интернете
SymbianC
Ну вобще статья само сабой хорош, а я б советовал б создать эл.книг автору, книга про С++ и все такое. А почему б нет?. Книга тож пособия учебник.. Ну эта мае мнение. А так я тож любител С++.
Patrick
Спасибо за статью!
Хотелось бы конечно побольше инфы про явное использование указателя this. В каких случаях он используется явно, где его лучше использовать и т.п. и с примерами:)
DESergik
Посмотри данную тему в книге Прата С. — Язык программирования С++. Лекции и упражнения — 2011. Там хороший пример на эту тему разобран ;)
Patrick
Спасибо, посмотрю:)