Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с *this 
V
    Опции темы
yngwie19
Дата 1.9.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Всем привет, простите за глупый вопрос. Помогите мне разобраться с указателем this, Во всех книгах написано, что он используется для возврата адреса объекта. Я не очень понимаю зачем это нужно и где это можно использовать. Объясните пожалуйста на примерах. СПАСИБО
PM MAIL   Вверх
mes
Дата 1.9.2008, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код

class A
{
    void f ();                   // есть ничто иное как void  f  (A *this); 
    void f1 (int i);          //                        void  f1 (A *this, int i); 
    void f2 (int i) const; //                           void  f2 (const A *this, int i); 
    

};
где вместо this, компилятор подставляет объект относительно которого произошел вызов.
то есть если a.f(); то this == &а , а для pa->f(); this == pa;


Это сообщение отредактировал(а) mes - 1.9.2008, 22:06


--------------------
PM MAIL WWW   Вверх
Lazin
Дата 1.9.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



this это, как уже было сказано указатель на объект, и используют его еще и так:

Код

class curiously_parentheses_printer
{
public:
    curiously_parentheses_printer& operator() (const char* c) {
        printf("%s", c);
        return *this;
    }
    curiously_parentheses_printer& operator() (int i){
        printf("%d", i);
        return *this;
    }
};

curiously_parentheses_printer p;
p("operator () called ")(3)(" times here");


Это сообщение отредактировал(а) Lazin - 1.9.2008, 22:26
PM MAIL Skype GTalk   Вверх
mes
Дата 1.9.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



 smile 
Цитата(Lazin @  1.9.2008,  22:25 Найти цитируемый пост)
и используют его еще и так:

интересно, данный пример отобъет желание понимать или все таки заинтригует ?! 



--------------------
PM MAIL WWW   Вверх
Lazin
Дата 1.9.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(mes @  1.9.2008,  22:30 Найти цитируемый пост)
интересно, данный пример отобъет желание понимать или все таки заинтригует ?!  

а что? без this нельзя реализовать вот такой-вот синтаксис a-la iostream
Код

cout << "a = " << a << endl;

по моему вполне наглядно smile

Это сообщение отредактировал(а) Lazin - 1.9.2008, 22:47
PM MAIL Skype GTalk   Вверх
mes
Дата 1.9.2008, 23:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Lazin @  1.9.2008,  22:45 Найти цитируемый пост)

а что? без this нельзя реализовать вот такой-вот синтаксис a-la iostream

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


--------------------
PM MAIL WWW   Вверх
Lazin
Дата 2.9.2008, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



ну вообще, в любом учебнике по плюсам, указатели рассматривают раньше, чем ООП, а перегрузка операторов - примерно там-же где и классы, наследование и тд...
PM MAIL Skype GTalk   Вверх
bsa
Дата 2.9.2008, 08:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(yngwie19 @ 1.9.2008,  21:42)
Всем привет, простите за глупый вопрос. Помогите мне разобраться с указателем this, Во всех книгах написано, что он используется для возврата адреса объекта. Я не очень понимаю зачем это нужно и где это можно использовать. Объясните пожалуйста на примерах. СПАСИБО

Сначала надо понять, что такое объект. Допустим, у нас есть класс MyClass. Это тип. Когда мы пишем 
Код
MyClass obj;
Мы создаем объект obj класса MyClass.
Допустим, MyClass имеет метод method(), который изменяет поле var:
Код
class MyClass
{
public:
    int method() { return ++var; }
private:
    int var;
};

MyClass obj;

obj.method();
Во-первых, компилятор неявно (т.е. незаметно для программиста) преобразовывает каждый нестатический метод, добавляя первый параметр указатель на MyClass. Во-вторых, любой доступ к переменным класса из методов приводит к виду this->var. Итого, в данном случае получается:
Код
int method(MyClass *this) { ++this->var; }
Итак, что происходит, когда вызывается method()? Компилятор неявно первым параметром передает указатель на obj, в итоге реальный вызов выглядит так:
Код
MyClass::method(&obj);

PM   Вверх
NebelDT
Дата 30.9.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.9.2008
Где: RU

Репутация: -6
Всего: -10



 smile 
Вобщем, this - это такой же обычный указатель, и логично сделать его умным указателем. Пусть сам о себе заботится. 
Код

class Foo : public boost::enable_shared_from_this<Foo>


PM MAIL WWW YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1318 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.