Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2010, 21:39   #1
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию Указатель this

Объясните, зачем нужен указатель this, как его применять в классах, если можно небольшой пример.
Golovastik вне форума Ответить с цитированием
Старый 15.01.2010, 21:59   #2
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

Указатель *this создается автоматически и указывает на объект, который вызывает метод...

например:
пусть есть класс STR; d нем в качестве привата объявлено поле суммы sum...объявив и инициализировав 2 объекта А и В (которые представляют собой два различных значения суммы) тебе нужно написать метод, который суммирует эти значения:

Код:
double STR::Summa (STR f)
{
STR t=*this;
return (t.sum+f.sum);
}
или же:
Код:
double STR::Summa (STR f)
{
return (sum+f.sum);
}
при вызове в main A.Summa(B); указатель *this будет указывать на параметр sum для объекта А...
JeyKip вне форума Ответить с цитированием
Старый 15.01.2010, 22:22   #3
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Ещё можно один примерчик, немного не до конца понятно.
Golovastik вне форума Ответить с цитированием
Старый 15.01.2010, 22:22   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Или вот хороший пример:

Код:
class A
{
public:

	A();

	virtual void exec() = 0;

};

void func( A * obj )
{
	obj->exec();
}

A::A()
{
	func( this );
}


class B : public A
{
public:

	void exec() {}

};


int main( int argc, char * argv )
{

	B x;

	return 0;
}

Последний раз редактировалось Carbon; 15.01.2010 в 22:25.
Carbon вне форума Ответить с цитированием
Старый 15.01.2010, 22:37   #5
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Закоментируйте пожалуйста код, что здесь происходит, желательно построчно, просто я с вирт. функциями ещё не знаком. Заранее благодарю.
Golovastik вне форума Ответить с цитированием
Старый 15.01.2010, 22:46   #6
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

виртуальные функции необходимы при наследовании, чтобы ты ее мог переопределить в классе-потомке...

Код:
void func( A * obj )
{
	obj->exec();
}
в этом коде создается указатель на тип базового класса и через него происходит вызов виртуальной функции...

Код:
A::A()
{
	func( this );
}
здесь в качестве параметра func( this ); используется указатель на тот объект, который вызвал функцию А()...то есть передается значение, принадлежащее объекту, который вызывает данную функцию...
JeyKip вне форума Ответить с цитированием
Старый 15.01.2010, 23:06   #7
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Golovastik, можешь открыть книгу на 460 странице:
Цитата:
Стивен Прата - Язык программирования C++. Лекции и упражнения
Вот в ней реально все понятно написано, ну это как по мне.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 15.01.2010, 23:15   #8
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

или Лаптев "С++ объектно-ориентированное программирование"; книжица очнь подробная и понятная для начинающих программистов...
JeyKip вне форума Ответить с цитированием
Старый 16.01.2010, 10:30   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Также полезно this возвращать в функциях наподобие add_something и операторах типа @=. Например,
Код:
class vector3D
{
public:
//...
vector3D& addX(double);
vector3D& operator+= (const vector3D);
//...
private:
double X, Y, Z;
}
operator<<(ostream&, vector3D);

vector3D& vector3D::addX(double xx)
{
X+= xx;
return *this;
}

vector3D& vector3D::operator+=(const vector3D V)
   {
   X += V.X; Y += V.Y; Z += V.Z;
   return *this;
   }
И тогда можно будет записать
Код:
vector3D V(1, 1, 1), U(2, 3, 4);
cout << (V += U).addX();
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатель на функцию Роман Радер Общие вопросы C/C++ 2 09.11.2009 00:50
Указатель в квадрате Golovastik Общие вопросы C/C++ 2 10.09.2009 18:54
(!)указатель на указатель(!) (C)stalin(Cpp) Общие вопросы C/C++ 0 07.06.2009 15:32
Указатель. Pointer AHTuKiLLeR Общие вопросы Delphi 6 27.05.2009 13:41
Указатель n на m CESHNIK Общие вопросы C/C++ 7 07.03.2008 23:35