HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Главная » Статьи » c++ |
С каждым занятием мы все глубже и глубже проникаемся идеями объектно-ориентированого программирования. Мы уже знаем как описать класс, как использовать модификаторы доступа. Сегодня, мы рассмотрим еще один важный вопрос, который касается объектно-ориентированого программирования - указатель this.Заметим, что это один из сложнейших вопросов, который рассматривается в ООП. Поэтому отниситесь к данной теме со всей серьезностью. Как показывает практика, многие реальные задачи из жизни требуют того, чтобы в протоколе описания класса существовала возможность вызова функции-члена внутри определения другой функции-члена. Если последовательно придерживаться объектно-ориентированной парадигмы, то вложенный вызов функции должен интерпретироваться как передача сообщения объекту (если Вы забыли что такое сообщение, загляните в первое занятие посвященное ООП). Объект, принимающий вложенное сообщение - это тот же самый объект, который обрабатывает сообщение, представленное вызовом внешней функции. Вложенный вызов функции в объектно-ориентированных языках интерпретируется как передача сообщения самому себе, что должно быть явно указано. В С++ для представления термина "сам себе" используется ключевое слово this. Таким образом, ключевое слово this используется для обозначения указателя на объект, который сгенерировал обращение к функции-члену. Всем функциям-членам указатель this передается автоматически. Ключевое слово this обозначает объявленный неявно указатель на себя. Другими словами, при реализации функций-членов класса, мы работаем с данными так, как будто они передаются через указатель this. Особенностью this является то, что он предоставляет встроенный не требующий объявления указатель. Другими словами, например, это то же самое, как если бы в классе Test неявно объявлялся закрытый член Test* const this. Заметим, что указатель this изменить нельзя. Обычно указатель this используется неявно, но в некоторых ситуациях желательно его явное использование, причем, использование this не отличается от использования любого другого указателя. Рассмотрим пример использования this. Ниже приведена тестовая программа, где создается класс Test в котором: объявлены два поля данных (с1 и с2); есть конструктор Test(char b) в котором происходит инициализация полей данных; функция-член Print(), которая позволяет вывести на экран содержимое полей данных (т.е. с1 и с2); функция-член Increment использует неявный указатель this, чтобы возвратить приращенные значения c1 и c2; а функция-член Where_Am_I возвращает адрес заданного объекта. #include <iostream.h> /*Демонстрация использования указателя this*/ class Test{ public: //конструктор Test(char b) { c1=b; c2=c1+1; } //функция увеличения Test Increment() { c1++; c2++; return (*this);//вернуть объект } //функция возвращает адрес памяти где расположен наш объект Test* Where_Am_I() { return this;//вернуть указатель на себя } //функция печати void Print() { cout<<c1<<c2<<'\t'; } private: char c1,c2; }; void main() { Test a('A');//создадим экземпляр класса Test a.Print();//выведем на экран значение полей данных //узнаем где мы (т.е.выведем адреса памяти, где расположен наш объект) cout<<"is at"<<a.Where_Am_I()<<endl; Test b('B');//создадим экземпляр класса Test b.Print();//выведем на экран значение полей данных //узнаем где мы (т.е.выведем адреса памяти, где расположен наш объект) cout<<"is at"<<b.Where_Am_I()<<endl; //вызываем функцию-член Increment() //так как функция возвращает экземпляр класса, то можем обратиться //к функции-члену Print b.Increment().Print(); } Результат работы программы следующий: AB is at0x0065FDF4 BC is at0x0065FDF0 CD Press any key to continue | |
Просмотров: 3417 | Рейтинг: 5.0/1 |
Всего комментариев: 0 | |