Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите разобраться с *this


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

Автор: mes 1.9.2008, 22:00
Код

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;

Автор: Lazin 1.9.2008, 22:25
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");

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

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

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

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

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

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

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

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

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

Автор: Lazin 2.9.2008, 07:50
ну вообще, в любом учебнике по плюсам, указатели рассматривают раньше, чем ООП, а перегрузка операторов - примерно там-же где и классы, наследование и тд...

Автор: bsa 2.9.2008, 08:13
Цитата(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);

Автор: NebelDT 30.9.2008, 20:50
 smile 
Вобщем, this - это такой же обычный указатель, и логично сделать его умным указателем. Пусть сам о себе заботится. 
Код

class Foo : public boost::enable_shared_from_this<Foo>


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)