Среда, 08.01.2025, 20:44
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++

this

С каждым занятием мы все глубже и глубже проникаемся идеями объектно-ориентированого программирования. Мы уже знаем как описать класс, как использовать модификаторы доступа. Сегодня, мы рассмотрим еще один важный вопрос, который касается объектно-ориентированого программирования - указатель 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


Категория: c++ | Добавил: slava (30.05.2011)
Просмотров: 3417 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]